假设总钱数为Sum且A分得的钱不超过B,开数组dp,dp[i]表示A是否可以分得一些硬币使得其总钱数为i,dp[i]为1表示可以,0表示不可以。
dp数组初始化为0,dp[0]=1。然后分别对M个硬币枚举,判断dp是否可置为1即可。最后选择离Sum/2最近且dp[i]==1的i即可。
我的解题代码如下:
#include#include #include #include #include using namespace std; #define min(a,b) (a > N; while(N--) { cin >> M; Sum = 0; for(int i=0; i> Coin[i]; Sum += Coin[i]; } memset(dp,0,sizeof(dp)); dp[0] = 1; for(int i=0; i =0; j--) //可以优化:for(int j=Sum/2-Coin[i]; j>=0; j--) 因为我们最后只要比Sum/2小的i值 { if(dp[j]) dp[j+Coin[i]] = 1; } } for(int i=Sum/2; i>=0; i--) if(dp[i]) { cout << Sum-2*i << endl; break; } } return 0; }