P2918

[USACO08NOV]Buying Hay S

题意描述

约翰的干草库存已经告罄,他打算为奶牛们采购 H(1 \leq H \leq 50000)H(1≤H≤50000) 磅干草。
他知道 N(1 \leq N\leq 100)N(1≤N≤100) 个干草公司,现在用 11 到 NN 给它们编号。第 ii 公司卖的干草包重量为 P_i (1 \leq P_i \leq 5,000)P i(1≤P i ≤5,000) 磅,需要的开销为 C_i (1 \leq C_i \leq 5,000)C (1≤C i
≤5,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

输入

2 15
3 2
5 3

输出

9

点拨

完全背包稍微转化一下,主要是数组那里的含义要表示清楚

代码

#include<iostream>
#include<utility>
using namespace std;
typedef long long ll;
#define fi(i,a,b) for(int i = a; i <= b; ++i)
#define fr(i,a,b) for(int i = a; i >= b; --i)
#define x first
#define y second
#define sz(x) ((int)(x).size())
#define pb push_back
using pii = pair<int,int>;
//#define DEBUG
int dp[60000];
int w[105];
int v[105];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
#ifdef DEBUG
    //freopen(D:\in.txt,r,stdin);
#endif
    int n,h;
    cin >> n >> h;
    int maxx = 0;
    fi(i,1,n) cin >> w[i] >> v[i],maxx = max(maxx,w[i]);
    fi(i,1,h + maxx) dp[i] = 0x3f3f3f3f;
    fi(i,1,n){
        fi(j,w[i],h+maxx) dp[j] = min(dp[j-w[i]] + v[i],dp[j]);
    }
    int minn = dp[h];
    // cout << dp[h] <<endl;
    fi(i,h,h+maxx) minn = min(minn,dp[i]);
    cout << minn << endl;
    return 0;
}
posted @ 2022-03-18 20:48  Sun-Wind  阅读(41)  评论(0编辑  收藏  举报