bzoj1618 / P2918 [USACO08NOV]买干草Buying Hay(完全背包)

P2918 [USACO08NOV]买干草Buying Hay

显然的完全背包

设$f[i]$为买$i$磅干草的最小代价

搞搞完全背包即可

注意到最后可能买的干草超出范围,但是价格可能更低。

于是我们的背包处理到$m+maxP$即可(本题$P_{i}<=5000$)

end.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define re register
 5 using namespace std;
 6 int min(int a,int b){return a<b?a:b;}
 7 #define P 5000
 8 int n,m,f[55005],a,b,ans;
 9 int main(){
10     memset(f,127,sizeof(f));ans=f[0];f[0]=0;
11     scanf("%d%d",&n,&m);
12     for(re int i=1;i<=n;++i){
13         scanf("%d%d",&a,&b);
14         for(re int j=a;j<=m+P;++j)//处理到m+maxP
15             f[j]=min(f[j],f[j-a]+b);
16     }
17     for(re int j=m+P;j>=m;--j) ans=min(ans,f[j]);//在超出的范围中找最小值
18     printf("%d",ans);
19     return 0;
20 }
View Code
原文地址:https://www.cnblogs.com/kafuuchino/p/9861009.html