多重背包二進制優化


多重背包二進制優化

\(num\)件,價值\(v\),花費\(cost\)的物品\((v,w)\)拆分為\((v,w),(v\times 2^1,w\times 2^1),(v\times 2^2,w\times 2^2),\cdots,(x,y)\)(其中\((x,y)\)是無法被拆分剩下來的余項),如此便可通過這些\(log_2^{num}\)件的物品湊成所有可能的取值狀態。

板子題 P1776 寶物篩選

#include <cstdio>
#define MAXN 100001*20
#define MAX(A,B) ((A)>(B)?(A):(B))
using namespace std;
int n,w,cnt;
int val[MAXN],cost[MAXN];
int dp[MAXN];
int main(){
    scanf("%d %d", &n, &w);
    for(int i=1;i<=n;++i){
        int tval,tcost,tnum;
        scanf("%d %d %d", &tval, &tcost, &tnum);
        for(int j=1;j<=tnum;j*=2){
            val[++cnt]=tval*j;
            cost[cnt]=tcost*j;
            tnum-=j;
        }
        if(tnum!=0) val[++cnt]=tnum*tval,cost[cnt]=tnum*tcost;
    }
    for(int i=1;i<=cnt;++i)
        for(int j=w;j>=cost[i];j--)
            dp[j]=MAX(dp[j],dp[j-cost[i]]+val[i]);
    printf("%d", dp[w]);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM