正整數分組 dp(01揹包)

2021-08-29 02:10:09 字數 827 閱讀 1189

time limit,1000 ms

memory limit,131072 kb

author  李陶冶

將一堆正整數分為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

輸出這個最小差

sample input

512

345

sample output

1
將這些數分為兩組,使差最小,為使差最小就要使每組的數的和盡量的接近sum/2這個值,所以可以sum/2看作揹包容量,那些整數看作要放入揹包中的物品,求揹包最大能放的數字和,最後sum減去最大的容量的兩倍(sum-2*dp[i])即為最小的差值。

#include #include #include #includeusing namespace std;

int a[110];

int dp[5010];

int main()

int b = sum/2;

memset(dp,0,sizeof(dp));

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

printf("%d\n",abs(sum-2*dp[b]));

return 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 正整數分組 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 輸出這個最小差 inpu...

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

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