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-2背包问题。In Reply To:经过本人验证,这并非什么0-1背包问题、只是一个扩展后的找零问题 Posted by:smfwuxiao at 2015-01-16 00:17:45 > 经过本人验证,这并非什么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