【W(wǎng)eek11作業(yè)-E - 選做題11-1】東東與 ATM POJ - 1276

算法

多重背包

題目描述

給出背包容量,以及數(shù)種物品,每種物品有數(shù)個;

解題思路

相比于0-1背包,多重背包每種物品有多個,直接拆解為0-1背包則物品過多;
相比于完全背包,多重背包每個物品個數(shù)有限制,無法直接倒著計算;
我們可以將每種物品根據(jù)其數(shù)量拆分為相應(yīng)二進(jìn)制,如13可拆成1+2+4+6;而1、2、4、6可組合出1-13中任意數(shù)量;故而因此轉(zhuǎn)化為0-1背包問題。

代碼

#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 100010;
int f[maxn];
int a[maxn];
int main(){
    int sum,n;
    while(cin>>sum>>n){
        memset(f,0,sizeof(f));
        int x,k;
        int cnt=0;
        for(int i=1;i<=n;i++){
            cin>>k>>x;
            int temp=1;
            while(temp<=k){
                a[++cnt]=temp*x;
                k-=temp;
                temp*=2;
            }
            if(k!=0){
                a[++cnt]=k*x;
            }
        }
        for(int i=1;i<=cnt;i++)
            for(int j=sum;j>=a[i];j--){
                f[j]=max(f[j-a[i]]+a[i],f[j]);
            }
        cout<<f[sum]<<endl;
    }
    return 0;
}

題目總結(jié)

求解多重背包應(yīng)將每種物品根據(jù)個數(shù)按二進(jìn)制拆解,轉(zhuǎn)化為0-1背包。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容