【BZOJ1618】[Usaco2008 Nov]Buying Hay 购买干草

描述 Description

约翰的干草库存已经告罄,他打算为奶牛们采购日 (1≤日≤50000) 磅干草.

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

输入格式 InputFormat

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

输出格式 OutputFormat

最小的开销.

样例输入 SampleInput

4 30
8 28
13 27
26 24
13 10

样例输出 SampleOutput

30

来源 Source

Silver


BZOJ 1618


代码 Code

完全背包问题,注意是至少要采购到 H 磅干草。

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define inf 0x7fffffff/27.11
const int maxp=500000;
int p[101],c[101];
int f[500001];
int i,j,t,n,m,l,r,k,z,y,x,ans;
int main()
{
    scanf("%d%d",&n,&m);
    for (i=1;i<=n;i++) scanf("%d%d",&p[i],&c[i]);
    for (i=1;i<=maxp;i++) f[i]=inf;
    f[0]=0;
    for (i=1;i<=n;i++)
    {
        for (j=p[i];j<=maxp;j++)
        {
            f[j]=min(f[j],f[j-p[i]]+c[i]);
        }
    }
    ans=inf;
    for (i=m;i<=maxp;i++) ans=min(ans,f[i]);
    printf("%d\n",ans);
    return 0;
}