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; 
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章