51nod 1007 正整数分组 01背包

来源:互联网 发布:嵌入式软件开发流程图 编辑:程序博客网 时间:2024/06/07 07:04

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1007
思路:先求出总和,然后用总和的一半作背包体积,看全部数能够装多少。然后拿总和减去已装的,得到另一半有多少。

#include<cstdio>#include<queue>#include<iostream>#include<vector>#include<map>#include<cstring>#include<string>#include<set>#include<stack>#include<algorithm>#define cle(a) memset(a,0,sizeof(a))#define inf(a) memset(a,0x3f,sizeof(a))#define ll long long#define Rep(i,a,n) for(int i=a;i<=n;i++)using namespace std;const int INF = ( 2e9 ) + 2;const int maxn = 110;int a[maxn];int dp[10010];int main(){    int n;    ll sum=0;    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);        sum+=a[i];    }    int v1=sum/2;    for(int i=1;i<=n;i++)    {        for(int j=v1;j>=a[i];j--)        dp[j]=max(dp[j],dp[j-a[i]]+a[i]);    }    printf("%d\n",sum-2*dp[v1]);}