1. 程式人生 > >51nod-1007正整數分組(簡單dp)

51nod-1007正整數分組(簡單dp)

傳送門

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

01揹包變形,設sum為所有數的和,要使分的兩組數差值最小,那麼其中一組要儘可能逼近sum/2。dp[i]陣列代表儘可能逼近 i 的結果,對於給出的每一個數,更新一遍dp陣列。

#include <bits/stdc++.h>
using namespace std;
const int N = 10000;

int a[N];
int dp[N];
int n, sum;
int main(){
	cin >> n;
	sum = 0;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		sum += a[i];
	}
	for(int i = 1; i <= n; i++)
	for(int v = sum/2; v >= a[i]; v--){
		dp[v] = max(dp[
v] , dp[v-a[i]] + a[i]); } cout << sum - 2*dp[sum/2] << endl; return 0; }