【洛谷 2918】买干草Buying Hay

题目描述

Farmer John is running out of supplies and needs to purchase H (1 <= H <= 50,000) pounds of hay for his cows.

He knows N (1 <= N <= 100) hay suppliers conveniently numbered 1..N. Supplier i sells packages that contain P_i (1 <= P_i <= 5,000) pounds of hay at a cost of C_i (1 <= C_i <= 5,000) dollars. Each supplier has an unlimited number of packages available, and the packages must be bought whole.

Help FJ by finding the minimum cost necessary to purchase at least H pounds of hay.

约翰的干草库存已经告罄,他打算为奶牛们采购H(1 \leq H \leq 50000)H(1H50000)镑干草.

他知道N(1 \leq N\leq 100)N(1N100)个干草公司,现在用11到NN给它们编号.第ii公司卖的干草包重量 为P_i (1 \leq P_i \leq 5,000)Pi(1Pi5,000) 磅,需要的开销为C_i (1 \leq C_i \leq 5,000)Ci(1Ci5,000) 美元.每个干草公司的货源都十分充足, 可以卖出无限多的干草包.

帮助约翰找到最小的开销来满足需要,即采购到至少HH镑干草.

输入格式

* Line 1: Two space-separated integers: N and H

* Lines 2..N+1: Line i+1 contains two space-separated integers: P_i and C_i

输出格式

* Line 1: A single integer representing the minimum cost FJ needs to pay to obtain at least H pounds of hay.

输入输出样例

输入 #1
2 15 
3 2 
5 3 
输出 #1
9 

说明/提示

FJ can buy three packages from the second supplier for a total cost of 9.

 

题解:发现自己一碰到完全背包就跑。开始复习完全背包!

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std;
const int N=15001;
int n,m,ans=0x3f3f3f3f;
int a[N],b[N],f[N];
int main(){
    freopen("2918.in","r",stdin);
    freopen("2918.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m+5000;i++) f[i]=1e9;
    for(int i=1;i<=n;i++)
        scanf("%d %d",&a[i],&b[i]);
    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<=5000+m;i++)
        ans=min(ans,f[i]);
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2019-10-28 20:30  #Cookies#  阅读(288)  评论(0编辑  收藏  举报