nyoj - 456 邮票分你一半

http://acm.nyist.net/JudgeOnline/problem.php?pid=456

题目看上去和上次做的搜索nyoj 325 zb的生日很像,但是再用暴力搜索dfs的结果必然是TLE~~解决这题的模型是01背包问题:先计算所有的邮票值sum,然后sum/2作为容量,每一张邮票的值代表一个物体的体积和价值,这就将问题转化为了经典的01背包问题。

我又用这个思想做了一些zb的生日,结果超时了,又优化了一下才勉强过去,很无语。。。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int n, sum;
int val[1005];
int result[50005];

int main()
{
int ncases, i, j;
scanf("%d", &ncases);
while(ncases--)
{
scanf("%d", &n);
sum = 0;
for(i = 1; i <= n; i++)
{
scanf("%d", &val[i]);
sum += val[i];
}
memset(result, 0, sizeof(result));
for(i = 1; i <= n; i++)
{
for(j = sum/2; j >= val[i]; j--)
{
if(result[j] < result[j-val[i]] + val[i])
result[j] = result[j-val[i]] + val[i];
}
}
printf("%d\n", sum - result[sum/2]*2);
}
return 0;
}

 

posted @ 2012-03-04 13:25  枫萧萧  阅读(521)  评论(0编辑  收藏  举报