poj 3628

01背包的变形。

代码:

#include<iostream>
#include<fstream>

using namespace std;

int dp[20000001];
int n,h;
int a[21];

void read(){
//	ifstream cin("in.txt");
	int i,j,k=0;
	cin>>n>>h;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
		k+=a[i];
	}
	for(j=1;j<=a[1];j++)
		dp[j]=a[1];
	for(j=a[1]+1;j<=h;j++)
		dp[j]=k;

	for(i=2;i<=n;i++)
	{
		for(j=h;j>a[i];j--)
		{
			dp[j]=min(dp[j],dp[j-a[i]]+a[i]);
			
		}
		for(j=a[i];j>0;j--)
			dp[j]=min(dp[j],a[i]);
	}
	cout<<dp[h]-h<<endl;
}

int main(){
	read();
	return 0;
}

posted on 2011-04-30 11:36  宇宙吾心  阅读(310)  评论(0)    收藏  举报

导航