poj 3628 Bookshelf 2 01背包!!!

 
01背包之后,dp[i]里面是所有组合到i的最优值,所以筛选一下就行了
#include<iostream>  
using namespace std;  
int main()
{
	int a[30],dp[1000005];
	int n,b;
	while(cin>>n>>b)
	{
		int sum=0;
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
			sum+=a[i];
		}
		memset(dp,0,sizeof(dp));
		for(int i=0;i<n;i++) //01背包 
		{
			for(int j=sum;j>=a[i];j--)
			dp[j]=max(dp[j-a[i]]+a[i],dp[j]);
		}
		int ans=0x7FFFFFFF;
		for(int i=0;i<=sum;i++)//筛选过程 
		{
			if(dp[i]>=b)
			ans=ans>dp[i]? dp[i]:ans;
		}
		cout<<ans-b<<endl;
	}
	return 0;
}

你可能感兴趣的:(poj 3628 Bookshelf 2 01背包!!!)