51nod 正整數分組 01揹包

2021-08-07 01:37:22 字數 738 閱讀 7344

將一堆正整數分為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剛開始沒看出來是01揹包,看了相關討論才知道,這是質量與價值相等的01揹包。

分成兩組,為了使兩組差值最小,盡量使兩組和靠近sum/2;

可知sum1>=sum/2 sum2<=sum/2

求出乙個sum2即可,總數減去sum2就是sum1,再減去sum1就是ans

#include 

using

namespace

std;

int a[105];

int main()

int c=sum/2;

int f[105][10005];

for(int i=1;i<=n;i++)

for(int j=0;j<=c;j++)

int ans = sum-2*f[n][c];

cout

0;}

51Nod 正整數分組(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...

51nod 1007 正整數分組(01揹包)

51nod 1007 正整數分組 類01揹包 解決問題 將一堆正整數分為2組,要求2組的和相差最小。換言之 這n個數中選出一些數,這些數的總和不超過 sum 2 且總和盡可能大。解決方法 dp i,j 表示 從前i個數中選出的數,總和不超過j的時候能得到的最大的和。初始值 dp 0,x 0 遞推式是...

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個正...