uva 562 Dividing Coins
2013-02-02 11:14
246 查看
一个比较简单,但对我来说比较纠结的一个dp问题。原题地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=503
就是分摊硬币,面值从1~500,最多一个背包有100个硬币,然后找出最小的分法,网站上的方法和我的有些不太一样,不过还是ac了。
本来认为写得没错,结果老是runtime error,而后发现m是非负的,我忘了考虑m是0的情况,以后做题努力养成严谨的习惯
就是分摊硬币,面值从1~500,最多一个背包有100个硬币,然后找出最小的分法,网站上的方法和我的有些不太一样,不过还是ac了。
本来认为写得没错,结果老是runtime error,而后发现m是非负的,我忘了考虑m是0的情况,以后做题努力养成严谨的习惯
#include <iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #define M 100 #define N 50000 using namespace std; int m; int num[M]; int d[M] ; int v[M] ; //两个背包,两者之差最小,其实我们只要对某一个硬币选或者不选,这样只会导致两种结果 //i表示从物品i开始选择,j表示两者之间已有的差值绝对值 int dp(int i,int j) { if(v[i][j]) return d[i][j]; v[i][j]=1; if(i==m-1) return d[i][j]=min(abs(j-num[i]),abs(j+num[i])); return d[i][j]=min(abs(dp(i+1,abs(j-num[i]))),abs(dp(i+1,abs(j+num[i])))); } int main() { int k,n; scanf("%d",&n); while(n--) { memset(d,0,sizeof(d)); memset(v,0,sizeof(v)); scanf("%d",&m); if(m>0) { for(k=0;k<m;k++) scanf("%d",&num[k]); printf("%d\n",dp(0,0));//从物品零开始选择,最开始差值为0 } else printf("0\n"); } return 0; }
相关文章推荐
- UVA - 562 Dividing coins
- UVa 562 - Dividing coins
- uva 562 Dividing coins
- UVA 562 Dividing coins
- uva 562 - Dividing coins
- UVA 562 Dividing coins
- UVA 562 - Dividing coins
- UVA 562 Dividing coins
- UVA 562 Dividing coins --01背包的变形
- UVA 562 - Dividing coins 动规 组合数
- UVA 562 Dividing coins 01背包
- UVa 562 - Dividing coins (0-1 变形)
- UVa 562 - Dividing coins
- uva 562Uva 562 Dividing coins
- UVa 562 Dividing Coins
- UVA 562 Dividing coins
- UVa 562 - Dividing coins
- UVA 562 Dividing coins
- UVA - 562 Dividing coins
- UVA 562 Dividing coins【补充分析】