多重背包二進制優化
阿新 • • 發佈:2018-02-26
font space pan %d fin new OS targe 優化
以這次水比賽為例題
[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;
}
多重背包二進制優化