购买干草
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[j−a[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;
}