一、算法分析
显然的背包问题,题目还强调了“每个干草公司的货源都十分充足”,判断是完全背包问题。但是本题的特点在于它是在求最小费用而非最大价值。
二、代码及注释
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int maxn=50005;
const int maxm=5000;
const int inf=999999999;
int n,h;
int f[maxn+maxm];
int c[105],w[105];
int main(){
for(int i=1;i<=maxn+maxm;i++) f[i]=inf;
cin>>n>>h;
for(int i=1;i<=n;i++) cin>>w[i]>>c[i];
for(int i=1;i<=n;i++)
for(int v=w[i];v<=h+maxm;v++)
if(f[v-w[i]]+c[i]<f[v]) f[v]=f[v-w[i]]+c[i]; //只要将求最大变成求最小即可
int ans=inf;
for(int i=h;i<=h+maxm;i++) ans=min(ans,f[i]); //但是这里每次都要加上maxm,因为可能存在采购超过h磅的情况(因为干草包按个算,无法拆分),但是不可能超过h+5000,因为每个干草包都是不超过5000磅重的。
return 0;
}