背包問題3(多重背包)

上一篇講的完全背包是指在所有物品件數(shù)無限多的情況下選擇最值中鼠,現(xiàn)在引申出多重背包問題绊起,即各物品個數(shù)w[ i ]均有限且不一定相同,且每件物品有其價值v[ i ]叫编,求這類情況下的最值。

多重背包問題的特點(diǎn)是數(shù)據(jù)量大霹抛,若按照01背包的做法開dp[ m ] [ n ]的數(shù)組進(jìn)行遍歷必會超時搓逾,所以建立數(shù)組時開設(shè)dp[ maxn ](maxn為數(shù)據(jù)可能達(dá)到的最大值)。
初始化將數(shù)組dp[ ]全部設(shè)為0杯拐,將dp[ 0 ]設(shè)為1霞篡。利用雙重循環(huán) i 從1到n遍歷w[ i ],內(nèi)層循環(huán) j 從v[ i ]開始往后遍歷端逼,只要dp[ j - v[ i ] ]值為真(即表示價值j-v[ i ]能夠滿足)且dp[ j ]值為假(表示價值 j 尚未被滿足)則價值 j 是有可能達(dá)到的朗兵。為什么說有可能?是因?yàn)槟芊襁_(dá)到價值 j 也得看v[ i ]的數(shù)量是否達(dá)到上限顶滩。如何記錄w[ i ]的數(shù)量呢余掖?還是要開設(shè)一個專門記錄個數(shù)的數(shù)組num[ maxn ],在第一層循環(huán)內(nèi)將數(shù)組num[ ]初始化為0礁鲁,一旦滿足 dp[ j - v[ i ] ]&&!dp[ j ]&&num[ j - v[ i ] ]<w[ i ] 則說明價值 j 是可以滿足的盐欺,則將dp[ j ]的值設(shè)為真赁豆,再將num[ j ]=num[ j - v[ i ] ]+1表示價值 j 所對應(yīng)的價值為v[ i ]的物品的使用數(shù)在價值為 j-v[ i ]的基礎(chǔ)上加1,此步操作尤為關(guān)鍵找田!之后根據(jù)題意看求什么邊操作即可歌憨。

特地強(qiáng)調(diào)!多重背包雖為背包問題的最后一篇墩衙,但其模板最好操作务嫡,幾乎百套百中!
模板:

    for(int i=1;i<=n;i++)
    {
        memset(num,0,sizeof(num));
        for(int j=v[i];j<=maxn;j++)
        {
            if(dp[j-v[i]&&!dp[j]&&num[j-v[i]]<w[i]) 
            {
                .......           //具體操作因題而異
                num[j]=num[j-v[i]]+1;  //求num[j]對應(yīng)的使用數(shù)
            }
        }
    }

典例:http://acm.hdu.edu.cn/showproblem.php?pid=2191
中文題漆改,沒有看不懂的心铃。
思路分析:典型的多重背包問題,開設(shè)一維數(shù)組dp[]挫剑,維數(shù)maxn便是最大價值量去扣,之后按照上述思路雙重循環(huán)便是,dp[maxn]所對應(yīng)的便是所能買到的最大情況樊破。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int main()
{
    int T,n,m;
    int v[105],w[105],num[105],dp[105];
    cin>>T;
    while(T--)
    {
        cin>>m>>n;
        for(int i=0;i<n;i++)
            cin>>v[i]>>w[i]>>num[i];
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++)
            for(int j=0;j<num[i];j++)
                for(int k=m;k>=v[i];k--)
                    dp[k]=max(dp[k],dp[k-v[i]]+w[i]);
        cout<<dp[m]<<endl;
    }
    return 0;
}

典例2:http://poj.org/problem?id=1742
題意:n種價值的硬幣愉棱,每種都有其數(shù)量w[ i ],給一個最大價值量m求出不超過最大價值量的情況下能湊出多少種價值哲戚。
分析:這題直接按照思路模板套就行了奔滑,一套就中。

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int use[100001];
int n,m;
bool dp[100001];
int v[1001],num[1001];
int main() 
{
    while (scanf("%d %d", &n, &m) != EOF) 
    {
        if (n == 0 && m == 0) break;
        for (int i = 0; i < n; ++i)
            scanf("%d", a+i);
        for (int i = 0; i < n; ++i) 
            scanf("%d", num+i);
        int res = 0;
        memset(dp,false,sizeof(dp));
        dp[0] = true;
        for (int i = 0; i < n; ++i) 
        {
            memset(use,0,sizeof(use));
            for (int j = a[i]; j <= m; ++j) 
            {
                if (!dp[j] && dp[j-a[i]] && use[j-a[i]]<num[i])
                {
                    dp[j] = true;
                    use[j] = use[j-a[i]] + 1;
                    ++res;
                }
            }
        }
        printf("%d\n", res);
    }
 return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顺少,一起剝皮案震驚了整個濱河市朋其,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脆炎,老刑警劉巖梅猿,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秒裕,居然都是意外死亡袱蚓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門几蜻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來癞松,“玉大人,你說我怎么就攤上這事入蛆∠烊兀” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵哨毁,是天一觀的道長枫甲。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么想幻? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任粱栖,我火速辦了婚禮,結(jié)果婚禮上脏毯,老公的妹妹穿的比我還像新娘闹究。我一直安慰自己,他們只是感情好食店,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布渣淤。 她就那樣靜靜地躺著,像睡著了一般吉嫩。 火紅的嫁衣襯著肌膚如雪价认。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天自娩,我揣著相機(jī)與錄音用踩,去河邊找鬼。 笑死忙迁,一個胖子當(dāng)著我的面吹牛脐彩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播姊扔,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼惠奸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旱眯?” 一聲冷哼從身側(cè)響起晨川,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤证九,失蹤者是張志新(化名)和其女友劉穎删豺,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愧怜,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呀页,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拥坛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓬蝶。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖猜惋,靈堂內(nèi)的尸體忽然破棺而出丸氛,到底是詐尸還是另有隱情,我是刑警寧澤著摔,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布缓窜,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏禾锤。R本人自食惡果不足惜私股,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恩掷。 院中可真熱鬧倡鲸,春花似錦、人聲如沸黄娘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寸宏。三九已至宁炫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氮凝,已是汗流浹背羔巢。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留罩阵,地道東北人竿秆。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像稿壁,于是被迫代替她去往敵國和親幽钢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容