UVA 562 Dividing coins (01背包)
2013-12-05 15:12
351 查看
题意:给你n个硬币,和n个硬币的面值。要求尽可能地平均分配成A,B两份,使得A,B之间的差最小,输出其绝对值。
思路:将n个硬币的总价值累加得到sum,
A,B其中必有一人获得的钱小于等于sum/2,另一人获得的钱大于等于sum/2。
因此用sum/2作为背包容量对n个硬币做01背包处理,
所能得到的最大容量即为其中一人获得的钱数。
思路:将n个硬币的总价值累加得到sum,
A,B其中必有一人获得的钱小于等于sum/2,另一人获得的钱大于等于sum/2。
因此用sum/2作为背包容量对n个硬币做01背包处理,
所能得到的最大容量即为其中一人获得的钱数。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxv=100*250+5; const int maxn=105; int dp[maxv]; int w[maxn]; int n,m,v; int sum; int main() { scanf("%d",&n); while(n--){ scanf("%d",&m); sum=0; for(int i=1;i<=m;i++){ scanf("%d",&w[i]); sum+=w[i]; } v=sum/2; memset(dp,0,sizeof(dp)); for(int i=1;i<=m;i++){ for(int j=v;j>=w[i];j--){ dp[j]=max(dp[j],dp[j-w[i]]+w[i]); } } int ans=abs(sum-dp[v]-dp[v]); printf("%d\n",ans); } return 0; }
相关文章推荐
- uva 562 - Dividing coins(01背包)
- UVA 562 Dividing coins 分硬币(01背包,简单变形)
- UVA 562 Dividing coins(dp + 01背包)
- uva 562 Dividing coins (01背包)
- UVA - 562 Dividing coins (01背包)
- UVA 562 Dividing coins(01背包)
- uva 562 Dividing coins(01背包)
- UVA - 562 Dividing coins(01背包)
- UVA 562 Dividing coins (01背包)
- UVA.562 Dividing coins (DP 01背包)
- UVA-562 Dividing coins(01背包)
- Uva 562 Dividing coins(01背包问题)
- uva562 - Dividing coins(01背包)
- 【解题报告】uva562_Dividing coins(划分硬币, dp, 01背包)
- UVA 562 Dividing coins (01背包)
- UVA 562 - Dividing coins(01背包)
- uva562 - Dividing coins(01背包)
- UVA 562 Dividing coins(dp + 01背包)
- UVA562 Dividing coins (01背包)
- UVA 562 Dividing coins(01背包)