NYOJ--第456题邮票分你一半

来源:互联网 发布:徐贤气质知乎 编辑:程序博客网 时间:2024/05/21 01:56

一道动态规划的问题,01背包问题。最近一直在纠结01背包,这个题算是自己的一个进展吧。先把代码贴出来,大家看看吧。不知道你们能不能看出这几串代码的不同。具体思路和下面代码的解释过段时间再写。今天弄这问题弄的头晕,贴完就洗洗睡了。

原题地址:点击打开链接。

代码如下:

#include<stdio.h>#include<string.h>int main(){int i,j,k,l,n,m,a[100005],b[100005];scanf("%d",&m);while(m--){scanf("%d",&n);memset(b,0,sizeof(b));memset(a,0,sizeof(a));int sum=0;for(i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];    }for(i=1;i<=n;i++){for(j=sum/2;j>=a[i];j--){   if(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;}
另一串代码

 #include<stdio.h>#include<string.h>int main(){int i,j,k,l,n,m,a[100005],b[100005];scanf("%d",&m);while(m--){scanf("%d",&n);memset(b,0,sizeof(b));memset(a,0,sizeof(a));int sum=0;for(i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];    }for(i=1;i<=n;i++){for(j=sum/2;j>=a[i];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;}        

又一串代码偷笑
 #include<stdio.h>#include<string.h>int a[100005],b[100005];int main(){int i,j,k,l,n,m;scanf("%d",&m);while(m--){scanf("%d",&n);memset(b,0,sizeof(b));memset(a,0,sizeof(a));int sum=0;for(i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];    }for(i=1;i<=n;i++){for(j=sum/2;j>=a[i];j--){   if(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;}        


原创粉丝点击