题目链接:
http://acm.nyist.net/JudgeOnline/problem.php?pid=325
http://acm.nyist.net/JudgeOnline/problem.php?pid=456
都可以用0,1背包问题来做,不过 zb的生日貌似用搜索更快(没试过。。。。。。),邮票分你一半貌似用搜索就会超时(也没试过)。因为看起来用0,1背包更简单,所以就用0,1背包做了。我博客以前写过0,1背包的详细解释,这里就不再贴了。
题目就是要你均分,如果不能均分就尽量使两堆重量/票价差距最小。可以想象成有一堆物品,两个容器(容量和除以2),只要保证把其中一个容器的容积尽量加满(当然恰好能满最好),这就转化成了0,1背包问题了。代码就简单了。两段代码几乎一样,所以给出邮票就行。
代码:
#include<stdio.h>
#include<string.h>
int main()
{
int ncases,n,i,j,sum,a[100001],b[100001];
scanf("%d",&ncases);
while(ncases--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum=sum+a[i];
}
for(i=1;i<=n;i++)
{
for(j=sum/2;j>=a[i];j--)//**j代表容量,逆推**//
{
b[j]=(b[j]>b[j-a[i]]+a[i]?b[j]:b[j-a[i]]+a[i]);
}
}
printf("%d\n",sum-2*b[sum/2]);
}
return 0;
}