UVA

来源:互联网 发布:win10装ubuntu 编辑:程序博客网 时间:2024/06/06 03:21

题意:给定n个硬币,要求将这些硬币平分以使两个人获得的钱尽量多,求两个人分到的钱最小差值。
思路:先将所有硬币的总额算出来为sum,以sum/2为背包容量,算出dp[sum/2],然后abs(sum-2*dp[sum/2])就是最小的差值;

#include<iostream>#include<algorithm>#include<string>#include<cstring>#include<map>#include<queue>#include<cmath>#include<stack>#include<vector>#include<cstdio>#define MAXN 33000#define INF 0x3f3f3f3f#define lmid l,m,rt<<1#define rmid m+1,r,rt<<1|1#define ls rt<<1#define rs rt<<1|1#define Mod 1000000007#define i64 __int64using namespace std;int num[105];int dp[30000];int main(){     int t;     scanf("%d",&t);     while(t--)     {          memset(dp,0,sizeof(dp));          int sum=0;          int n;          scanf("%d",&n);          for(int i=0;i<n;i++)          {               scanf("%d",&num[i]);               sum+=num[i];          }          int m=(sum+1)/2;          for(int i=0;i<n;i++)               for(int j=m;j>=num[i];j--)          {               dp[j]=max(dp[j],dp[j-num[i]]+num[i]);          }          cout<<abs(sum-2*dp[m])<<endl;     }     return 0;}