zoukankan      html  css  js  c++  java
  • 51nod 1007 正整数分组【01背包变形】

    基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
     收藏
     关注
    将一堆正整数分为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的(就是和的中间点)

    那么我们就可以把这道题目转化为简单的01背包了。

    1. dp[i][j]  表示前i个数能表示数j最接近的值   
    2. 转移方程,类似背包。。dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]);  

    【代码】:

    #include <bits/stdc++.h>
    using namespace std;
    #define LL long long
    
    const int maxn = 10000+10;
    int main()
    {
        int n,sum=0;
        int a[105],dp[maxn];
        memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
    
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        int t=sum;
        sum/=2;
        for(int i=0;i<n;i++)
        {
            for(int j=sum;j>=a[i];j--)
            {
                dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
            }
        }
        printf("%d
    ",t-2*dp[sum]);
        return 0;
    }
    View Code
  • 相关阅读:
    解决Too many connections问题
    TPCC-MySQL安装、使用及结果解读
    Spring事务配置
    【转】Spring事务介绍
    Spring AOP的实现原理
    Spring AOP的使用
    Spring整合Junit4进行单元测试
    Spring Bean定义的三种方式
    spring集成Redis(单机、集群)
    Redis搭建(五):Cluster集群搭建
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7790140.html
Copyright © 2011-2022 走看看