• 51Nod 1007 正整数分组 -简单DP


    题意:  将一堆正整数分为2组,要求2组的和相差最小。
    例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。
    N<=100 sum<=10000
    想了个N*sum的lowDP
    网上还有背包做法,很神奇
    最简单的我觉还是扫一遍,set作为答案暴力更新 
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    #include <cstring>
    #include <set>
    using namespace std;
    typedef long long ll;
    inline void r(ll&num){
        num=0;ll f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
        num*=f;
    }
    inline void r(int &num){
        num=0;int f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
        num*=f;
    }
    const int maxn = 2e4+10;
    int dp[110][maxn];
    
    int main()
    {
        int n;
        r(n);
        int t;
        dp[0][10000]=1;
        int val;
        for(int i=1;i<=n;i++)
        {
            r(t);
            for(int j=0;j+t<=20000;j++)
            {
                if(dp[i-1][j])
                {
                    val = j-10000;
                    dp[i][val-t+10000] = dp[i-1][j];
                    dp[i][val+t+10000] = dp[i-1][j];
                }
            }
        }
        int x = maxn;
        for(int i=0;i<=20000;i++)
        {
            if(dp[n][i])
            {
                val = i-10000;
                x = min(x,abs(val));
            }
        }
        printf("%d
    ",x);
        return 0;
    }
    AC代码
  • 相关阅读:
    第十六周总结
    第十五周学习进度
    输出最长字符串链
    第二阶段冲刺10
    第二阶段冲刺09
    第二阶段冲刺08
    输入法评价
    第十四周进度总结
    collections模块
    shutil模块(了解)
  • 原文地址:https://www.cnblogs.com/Geek-xiyang/p/5805523.html
Copyright © 2020-2023  润新知