51 Nod 1007 正整數分組【類01揹包】

1007 正整數分組html

基準時間限制:1 秒 空間限制:131072 KB 分值: 10
將一堆正整數分爲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的(就是和的中間點)c++

那麼咱們就能夠把這道題目轉化爲簡單的01揹包了。算法

下面給出AC代碼:
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define N 10010
 4 int a[N]; 
 5 int n;
 6 int dp[N];
 7 int  main(void)
 8 {    
 9      while(scanf("%d",&n)!=EOF)
10      {
11        int sum=0;
12        for(int i=1;i<=n;i++)
13        {
14              cin>>a[i];
15              sum+=a[i];//挑選出一些數字,是的越靠近sum/2,那麼就是揹包問題了 
16        }
17        memset(dp,0,sizeof(dp));
18        for(int i=1;i<=n;i++)
19                for(int j=sum/2;j>=a[i];j--)
20                    dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
21        cout<<abs((sum-dp[sum/2])-dp[sum/2])<<endl;
22      }
23       return 0;
24 }
相關文章
相關標籤/搜索