• 51Nod 1007 正整数分组 01背包


    将一堆正整数分为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
    输出这个最小差
    Input示例
    5
    1
    2
    3
    4
    5
    Output示例
    1

    思路:

    尽可能的均分为sum/2,但是不能用贪心,明显是错的,样例都举不出来

    相当于给了一个sum/2的背包,问能够装的最大值,再计算差值

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int ans[105],dp[5005];
     4 int main() {
     5     ios::sync_with_stdio(false);
     6     int n,sum=0;
     7     memset(ans,0,sizeof(ans));
     8     memset(dp,0,sizeof(dp));
     9     cin>>n;
    10     for(int i=1;i<=n;++i) {
    11         cin>>ans[i];
    12         sum+=ans[i];
    13     }
    14     int temp=sum;
    15     if(sum%2) sum=sum/2+1;
    16     else sum=sum/2;
    17     for(int i=1;i<=n;++i) {
    18         for(int j=sum;j>=ans[i];--j) {
    19             dp[j]=max(dp[j],dp[j-ans[i]]+ans[i]);
    20         }
    21     }
    22     cout<<abs(temp-dp[sum]-dp[sum])<<endl;
    23     return 0;
    24 }
    View Code
  • 相关阅读:
    amd
    富文本编辑器
    css module
    uc浏览器调试
    mysql利用sql语句将查询结果导出
    自启程序为何自启失败?
    nginx4层代理ssh服务
    创建SFTP用户并指定访问目录 Linux
    01月04日17:15:40 学习进度笔记
    01月04日10:39:23总结
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/7827644.html
Copyright © 2020-2023  润新知