uva562 - Dividing coins(简单动规)
2013-06-03 23:07
246 查看
找平衡的01背包问题。。。。
开始的时候不知道怎么直接动规出答案,
后来人家的思路,才发现这道题可以间接的动规出来答案。
就是把sum求出来,然后用动规枚举所有组合情况。然后找最小的sum-i和i的差值,min{sum-i-i}
这道题有sum==i的情况。
即
1
1
5
答案应该是5
所以最后找的时候要从0--sum遍历。
最后的遍历可以优化。
开始的时候不知道怎么直接动规出答案,
后来人家的思路,才发现这道题可以间接的动规出来答案。
就是把sum求出来,然后用动规枚举所有组合情况。然后找最小的sum-i和i的差值,min{sum-i-i}
这道题有sum==i的情况。
即
1
1
5
答案应该是5
所以最后找的时候要从0--sum遍历。
#include <cstdio> #include <cstring> #include <cstdlib> #define M 50005 #define N 105 #define INF 0x7fffffff int n, v ; bool f[M]; int main () { int cas, sum; scanf("%d",&cas); while(cas--) { sum = 0; scanf("%d",&n); for(int i = 0; i < n; i++) {scanf("%d",&v[i]); sum+=v[i];} memset(f,0,sizeof(f)); f[0] = 1; for(int i = 0; i < n; i++) for(int j = sum; j >= v[i]; j--) if(f[j-v[i]]) f[j] = 1; int min = INF; for(int i = 0; i <= sum; i++) if(f[i]) { int tt = abs(sum-i-i); min = min > tt ? tt : min; } printf("%d\n",min); } return 0; }
最后的遍历可以优化。
for(int i = sum/2; i >= 0; i--) if(f[i]) {min = i; break; } printf("%d\n",sum-2*min);
相关文章推荐
- UVa 562 Dividing coins(简单DP)
- UVA 562 Dividing coins 分硬币(01背包,简单变形)
- UVA 562 - Dividing coins 动规 组合数
- hdu 1421 1159 1087 1160 5366 1257 light OJ 1110 uva 562 简单dp
- uva 562 Dividing coins (0/1背包)
- Uva 562 Dividing coins
- UVA-562 Dividing coins(01背包)
- UVA - 562 Dividing coins(01背包)
- UVA562 Dividing coins (01背包)
- uva 562 Dividing coins(01背包)
- Uva 562 Dividing coins(01背包问题)
- uva562 Dividing coins
- uva 562 - Dividing coins(01背包)
- uva 562 dividing coins
- UVA 562 Dividing coins(DP:01背包)
- Uva 562— Dividing coins
- UVA_562_Dividing coins
- UVA 562 Dividing coins(01 背包问题)
- uva116 - Unidirectional TSP(简单动规)
- uva562 - Dividing coins(01背包)