01背包求解组合最值问题
【题目描述】(Stone1.cpp/c/pas) Ural 1005
给出一堆魔法石的重量,问如何分成两堆,使得它们质量和之差最小,求出这个最小值。
【输入格式】
第一行一个数n (n ≤30)。
接下来n行,每行一个正整数。(每个数≤100000)
【输出格式】
一个整数表示两组数字和的最小差。
【输入样例1】
5
1 2 3 4 5
【输出样例1】
1
【输入样例2】
5
5 8 13 27 14
【输出样例2】
3
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1500000+10;
int a[100];
int dp[maxn];
int main(){
freopen("Stone1.in","r",stdin);
freopen("Stone1.out","w",stdout);
int n;
scanf("%d",&n);
int sum=0;
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
for (int i=1;i<=n;i++){
for (int j=sum;j>=a[i];j--){
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
}
int ans=10000000;
for (int i=0;i<=sum;i++){
int t=fabs(sum-dp[i]-dp[i]);
if(dp[i])
ans=min(ans,t);
}
printf("%d\n",ans);
return 0;
}