UVA.562 Dividing coins (DP 01背包)
2017-02-16 00:40
525 查看
UVA.562 Dividing coins (DP)
题意分析
给出一堆不同面额的硬币,要求将这这些硬币分为价值接近的2堆(越接近越好,相等的情况最佳,且单个硬币不可再分),并最后输出这2堆硬币价值差值的绝对值。先累加求出这堆硬币的总和sum,然后令sum/2为背包容量,所有硬币为商品做01背包即可。最后求出的解为其中一堆最多能分多少价值的硬币(设为x),那么另一堆硬币的价值为sum-x,故两堆硬币的差值为sum-x*2。
核心状态转移方程:
dp[i][j] = max(dp[i][j],dp[i-1][j-a[i]]+a[i])
代码总览
/* Title:UVA.562 Author:pengwill Date:2017-2-16 */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define nmax 105 #define mc 50000 using namespace std; int a[nmax],dp[nmax][mc]; int main() { int t; scanf("%d",&t); while(t--){ int n,c = 0; scanf("%d",&n); memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); for(int i = 1; i<=n; ++i) {scanf("%d",&a[i]); c+=a[i];} for(int i =1; i<=n;++i){ for(int j = 0;j<=c/2;++j){ dp[i][j] = dp[i-1][j]; if(j>=a[i]) dp[i][j] = max(dp[i][j],dp[i-1][j-a[i]]+a[i]); } } printf("%d\n",c-2*dp [c/2]); } return 0; }
相关文章推荐
- 【解题报告】uva562_Dividing coins(划分硬币, dp, 01背包)
- UVA 562 Dividing coins(01背包)
- UVA-562 Dividing coins(01背包)
- UVA 562 Dividing coins (01背包)
- UVA 562 Dividing coins(dp + 01背包)
- uva562 - Dividing coins(01背包)
- UVA 562 Dividing coins(01dp)
- UVA562 Dividing coins (01背包)
- UVA - 562 Dividing coins (01背包)
- UVA 562 Dividing coins (01背包)
- uva562 - Dividing coins(01背包)
- uva 562 Dividing coins (01背包)
- Dividing coins - UVa 562 dp背包
- UVa 562 Dividing coins(简单DP)
- 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 分钱 dp
- UVA - 562 Dividing coins(01背包)