以这次水比赛为例题
[luogu]
对于多重背包和完全背包的混合问题,可以让完全背包的件数等于一个很大的数(比如99999),然后二进制转化一下,再按照01背包解决就好了
#include<cstdio> #include<iostream> #define N 1000005 using namespace std; int n,m; int c,t,p,cnt; int val[N],size[N]; int f[1005]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d%d%d",&c,&t,&p); if(!p) p=1005; for(int k=1;k<=p;k<<=1){ val[++cnt]=k*t; size[cnt]=k*c; p-=k; } if(p) val[++cnt]=p*t,size[cnt]=p*c;//这句话不能忘 } for(int i=1;i<=cnt;i++){ for(int j=m;j>=size[i];j--) f[j]=max(f[j],f[j-size[i]]+val[i]); } printf("%d",f[m]); return 0; }
原文地址:https://www.cnblogs.com/YoungNeal/p/8472377.html
时间: 2024-10-20 05:59:21