这题是个多重背包的裸题,但有一点不同,即:
多重背包的F[j]代表在不超过j磅的干草下,最小的开销
而本题的F[j]表示用(≥F[j])磅干草的最小开销
这看起来有点麻烦,但其实只需将多重背包的程序稍稍改下即可
就是可能在“背包容量”大于h的地方所用的“钱”比在h位置的少,那我们就遍历>=h,的花费找到最小值即可
ACcode:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,h,f[50005],w[105],c[105];
void solve() {
cin>>n>>h;
for(int i=1;i<=n;i++) cin>>w[i]>>c[i];
for(int i=1;i<=h+5000;i++) f[i]=1e9;
for(int i=1;i<=n;i++){
for(int j=w[i];j<=h+5000;j++){
f[j]=min(f[j],f[j-w[i]]+c[i]);
}
}
int mmin=1<<30;
for(int i=h;i<=h+5000;i++){
mmin=min(mmin,f[i]);
}
cout<<mmin<<"\n";
}
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t=1;
//cin>>t;
while(t--) {
solve();
}
return 0;
}
over~