1. 程式人生 > >51Nod1007 正整數分組(01揹包)

51Nod1007 正整數分組(01揹包)

這道題思路就是算出陣列總和,在陣列中找到和最接近陣列總和一半的一些數。

可以用01揹包解決這道題,dp[i][j]表示在陣列前i項中最接近j的最大值。

狀態轉移方程為:dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]);

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[105][10005];
int main()
{	
	int n,sum=0,i,j;
	cin>>n;
	int a[10005];
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
		sum+=a[i];
	} 
	memset(dp,0,sizeof(dp));
	for(i=1;i<=n;i++)
		for(j=sum/2;j>=a[i];j--)
			dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]);
	cout<<sum-2*dp[n][sum/2]<<endl;
	return 0; 
}