zoukankan      html  css  js  c++  java
  • 51nod 1007 正整数分组

    将一堆正整数分为2组,要求2组的和相差最小。
    例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。
     
    Input
    第1行:一个数N,N为正整数的数量。
    第2 - N+1行,N个正整数。
    (N <= 100, 所有正整数的和 <= 10000)
    Output
    输出这个最小差
      

        对于题意,可以猜想2组的差最小,那么每一组都要接近sum/2,这样就转化成了普通的0 - 1背包了。
    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define INF 99999999
    #define mod 1000000007
    #define ll __int64
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define key_value ch[ch[root][1]][0]
    using namespace std;
    const int MAXN = 110;
    int dp[10010];
    int n,m;
    int val[MAXN];
    int main()
    {
        while(cin >>n)
        {
            int sum = 0;
            for(int i = 1; i <= n; i++){
                cin >>val[i];
                sum += val[i];
            }
            sort(val+1,val+n+1);
            memset(dp,0,sizeof(dp));
            for(int i = 1; i <= n; i++){
                for(int j = sum/2; j >= val[i]; j--){
                    dp[j] = max(dp[j],dp[j - val[i]]+val[i]);
                }
            }
            cout<<abs(sum - dp[sum/2]*2)<<endl;
        }
    }
  • 相关阅读:
    一些常用的库[转载]
    《三国演义》很给力演绎60条职场真理
    保证你现在和未来不失业的10种关键技【转载】
    百度面试题
    百度的一到算法i题
    FindMaxDeep
    csinglelink
    FindLongArray
    byte转hex,hex转byte
    获取异常信息
  • 原文地址:https://www.cnblogs.com/sweat123/p/5262292.html
Copyright © 2011-2022 走看看