poj 3628 Bookshelf 2

dfs

#include <iostream>
#include <algorithm>

using namespace std;

int ar[25],n,b,ans=0x3f3f3f3f;

void dfs(int i,int high)
{
	int j;
	if (high>=b)
	{
		if (high<ans)ans=high;
		return;
	}
	for (j=i;j<n;j++)
	{
		dfs (j+1,ar[j]+high);
	}
}

int main()
{
	int i,j;
	cin>>n>>b;
	for (i=0;i<n;i++)
	{
		cin>>ar[i];
	}
	sort(ar,ar+n);
	dfs(0,0);
	cout<<ans-b<<endl;
	return 0;
}

dp

#include <iostream>
#include <algorithm>

using namespace std;

int dp[1000005]={0};

int main()
{
	int i,j,n,b,ar[25],ans=0x3f3f3f3f,sum=0;
	cin>>n>>b;
	for (i=0;i<n;i++)
	{
		cin>>ar[i];
		sum+=ar[i];
	}
	for (i=0;i<n;i++)
	{
		for (j=sum;j>=ar[i];j--)
		{
			dp[j]=max(dp[j],dp[j-ar[i]]+ar[i]);
		}
	}
	for (i=b;i<=sum;i++)
	{
		if(dp[i]>=b)
			ans=min(ans,dp[i]);
	}
	cout<<ans-b<<endl;
	return 0;
}
posted @ 2011-10-20 22:28  104_gogo  阅读(121)  评论(0编辑  收藏  举报