购买干草


Description

约翰的干草库存已经告罄,他打算为奶牛们采购H(1≤H≤50000)磅干草,他知道N(1≤N≤100)个干草公司,现在用1到N给它们编号。第i个公司卖的干草包重量为Pi(1≤Pi≤5000)磅,需要的开销为Ci(l≤Ci≤5000)美元.每个干草公司的货源都十分充足,可以卖出无限多的干草包.帮助约翰找到最小的开销来满足需要,即采购到至少H磅干草.

Input

第1行输入N和H,之后N行每行输入一个Pi和Ci.

Output

最小的开销.

Sample Input

2 15 
3 2 
5 3 

Sample Output

9

解题思路

这道题也是使用完全背包的方法,只不过要赋初值,还要判断最小值。
状态转移方程:
f o r ( i n t j = a [ i ] ; j < = m + 5000 ; j + + ) for(int j=a[i];j<=m+5000;j++) for(intj=a[i];j<=m+5000;j++)
f [ j ] = m i n ( f [ j ] , f [ j − a [ i ] ] + b [ i ] ) ; f[j]=min(f[j],f[j-a[i]]+b[i]); f[j]=min(f[j],f[ja[i]]+b[i]);

#include<iostream>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int ans=2100000000,n,m,a[55010],b[55010],f[55010];
int main()
{
   
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	 cin>>a[i]>>b[i];
	for(int i=1;i<=m+5000;i++)//到m+5000,就可以保证f数组里有最小的结果
	 f[i]=2100000000;//赋初值,为了后面判断最小值
	for(int i=1;i<=n;i++)
	{
   
		for(int j=a[i];j<=m+5000;j++)
		 f[j]=min(f[j],f[j-a[i]]+b[i]);//状态转移方程
	}
	for(int i=m;i<=m+5000;i++)
	 ans=min(ans,f[i]);//求最小值
	cout<<ans;
	return 0;
}