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

    基准时间限制: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背包了


    #include<stdio.h>
    #include<climits>
    #include<algorithm>
    #include<stack>
    #include<iostream>
    #include<cmath>
    #include<set>
    #include<vector>
    #include<map>
    #include<queue>
    #include<string.h>
    using namespace std;
    #define N 10010
    int a[N]; 
    int n;
    int dp[N];
    int  main(void)
    {	
    	 while(scanf("%d",&n)!=EOF)
    	 {
           int sum=0;
           for(int i=1;i<=n;i++)
           {
    		     cin>>a[i];
    		     sum+=a[i];//挑选出一些数字,是的越靠近sum/2,那么就是背包问题了 
           }
           memset(dp,0,sizeof(dp));
           for(int i=1;i<=n;i++)
           {
      		     for(int j=sum/2;j>=a[i];j--)
      		     {
    		  		 dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
    	         }
           }
           cout<<abs((sum-dp[sum/2])-dp[sum/2])<<endl;
    	 }
     	 return 0;
    }
    


  • 相关阅读:
    p3159 [CQOI2012]交换棋子
    三分法
    p2805 [NOI2009]植物大战僵尸
    p2604 [ZJOI2010]网络扩容
    p1129 [ZJOI2007]矩阵游戏
    有趣与愉快-------罗辑思维整理
    张小龙的书单
    会议
    使用CCProxy代理遇到的问题
    关于看书
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9387045.html
Copyright © 2011-2022 走看看