1. 程式人生 > >多重背包二進制優化

多重背包二進制優化

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; }

多重背包二進制優化