Uva 562 0-1背包

来源:互联网 发布:福昕阅读器 mac 中文 编辑:程序博客网 时间:2024/06/06 02:34

题意:给你n枚硬币,分成两份,求两份硬币之和的差最小是多少。

分析:求出总的硬币和的一半当做背包容量,然后让背包尽可能装多的硬币,这就装换成了0-1背包问题。这题刚开始没理解题意,数组开小了。。。


#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<queue>#include<vector>using namespace std;#define maxn 50002#define INF 0x3f3f3f3fint n,t;int a[maxn];int d[maxn];int main(){   //freopen("f.txt","r",stdin);    cin>>t;   while(t--){        scanf("%d",&n);        int sum=0;        for(int i=1;i<=n;i++){            scanf("%d",&a[i]);            sum+=a[i];        }        int bag=sum/2;        memset(d,0,sizeof(d));        for(int i=1;i<=n;i++){            for(int j=bag;j>=a[i];j--){              // d[i][j]=((i==1)?0:d[i-1][j]);               d[j]=max(d[j],d[j-a[i]]+a[i]);            }        }        int ans;        ans=sum-2*d[bag];        printf("%d\n",ans);    }}


0 0
原创粉丝点击