51Nod1007 正整数分组(01背包)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42391248/article/details/84202058

这道题思路就是算出数组总和,在数组中找到和最接近数组总和一半的一些数。

可以用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; 
}

猜你喜欢

转载自blog.csdn.net/qq_42391248/article/details/84202058
今日推荐