Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
经过本人验证,这并非什么0-1背包问题、只是一个扩展后的找零问题经过本人验证,这并非什么0-1背包问题、只是一个扩展后的找零问题。 分析: 平分marbles的问题等价于在marbles中,寻找一个组合,达到价值的1/2即可(剩下部分的价值自然是1/2)。因此,问题转化为如何寻找一个组合,使得价值 = 1/2 * value。 明显是一个用面值为1~6,凑出 1/2 * value 的找零问题。 代码如下: // POJ 1014 dividing #include <iostream> using namespace std; bool match(int (&marbles)[6], int value) { if ( value == 0 ) { return true; } for ( int i = 6; i >= 1; --i ) { int n = value / i; n = min(n, marbles[i-1]); if ( n > 0 ) { marbles[i-1] -= n; if ( match(marbles, value - n * i) ) { return true; } marbles[i-1] += n; } } return false; } bool dividing(int (&marbles)[6]) { int value = 0; for ( int i = 0; i < 6; ++i ) { value += (i + 1) * marbles[i]; } if ( value % 2 != 0 ) { return false; } return match(marbles, value / 2); } int main(int argc, char* argv[]) { int marbles[6] = {0}; int count = 1; while ( true ) { for ( int i = 0; i < 6; ++i ) { cin >> marbles[i]; } bool stop = true; for ( int j = 0; j < 6; ++j ) { if ( marbles[j] ) { stop = false; } } if ( stop ) { break; } cout << "Collection #" << count++ << ":" << endl; if ( dividing(marbles) ) { cout << "Can be divided." << endl << endl; } else { cout << "Can't be divided." << endl << endl; } } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator