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;
}

posted @ 2017-12-06 18:45  lmjer  阅读(327)  评论(0编辑  收藏  举报