题目描述
两个大盗终于偷来了n个金块,第i块重量为x[i]斤。他们希望将这n个金块分成两组,要让这两组重量最接近,求每组重量为多少。
输入输出格式
输入格式
输入第一行为正整数n,n<=20
第二行为n个正整数,均不超过1000
输出格式
输出一行包含两个数字,较小的数字先输出。
AC代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,a[10000],dp[10000],w[10000],v[10000];
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++){w[i]=a[i];v[i]=w[i];}
int sum=0;
for(int i=1;i<=n;i++)sum+=a[i];
int m=sum/2;
for(int i=1;i<=n;i++)
for(int j=m;j>=w[i];j--)
if(j>=w[i]){
//if(dp[j-w[i]]>=dp[j])w[i]=-1;
dp[j]=max(dp[j-w[i]]+v[i],dp[j]);
}
cout<<dp[m]<<' '<<sum-dp[m];
return 0;
}