题目链接:
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; }