NYOJ 456 邮票分你一半
2014-09-10 15:35
218 查看
题意:每张邮票都有各自的价值,现在将其分成两份,要求两堆的差值最小。
思路:用0-1背包的思想做。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
int dp[1000010];
int c[1010];
int v[1010];
using namespace std;
int main() {
int n,w;
int T;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
memset(dp,0, sizeof(dp));
int sum=0;
for(int i=1; i<=n; i++) {
scanf("%d",&v[i]);
sum+=v[i];
}
for(int i=1; i<=n; i++) {
for(int j=sum/2; j>=v[i]; j--) {
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
}
printf("%d\n",sum-2*dp[sum/2]);
}
return 0;
}
思路:用0-1背包的思想做。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
int dp[1000010];
int c[1010];
int v[1010];
using namespace std;
int main() {
int n,w;
int T;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
memset(dp,0, sizeof(dp));
int sum=0;
for(int i=1; i<=n; i++) {
scanf("%d",&v[i]);
sum+=v[i];
}
for(int i=1; i<=n; i++) {
for(int j=sum/2; j>=v[i]; j--) {
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
}
printf("%d\n",sum-2*dp[sum/2]);
}
return 0;
}
相关文章推荐
- nyoj 456——邮票分你一半——————【背包思想搜索】
- NYOJ--456--邮票分你一半
- NYOJ 456-邮票分你一半(01背包)
- NYOJ 456 邮票分你一半(背包问题)
- nyoj 456 邮票分你一半
- NYOJ 456 邮票分你一半
- NYOJ 456 邮票分你一半 【0 1背包】
- nyoj 456 邮票分你一半<背包>
- nyoj 456 邮票分你一半
- nyoj 456 邮票分你一半
- nyoj456_邮票分我一半
- (NYoj 325 zb的生日 和 456 邮票分你一半) 两个一样的题目不同的处理方法。(注意看题目中参数的较小值)
- NYOJ 456 邮票分你一半
- NYOJ_456_邮票分你一半
- NYOJ 456 邮票分你一半(01背包)
- nyoj 456 邮票分你一半 【母函数】【01背包】
- NYOJ 456 邮票分你一半
- NYOJ 456 邮票分你一半
- nyoj456邮票分你一半
- nyoj - 456 邮票分你一半