背包系列問題之--01背包(要求背包必須裝滿)

問題描述

????小偷深夜?jié)撊胍患抑閷毜辏昀镉?件寶物,重量分別為W{1,3,2,4,5},對應(yīng)的價(jià)值為V{200,100,300,150,350 }仲义。小偷隨身只攜帶了一個承重為5的背包,問小偷應(yīng)如何選擇才能使偷得寶物的價(jià)值最大并要求背包必須恰好裝至承重極限值

問題分析

????題目條件要求背包必須恰好裝至承重極限值(后文簡稱"裝滿條件")埃撵,解題關(guān)鍵就在這里赵颅。還是從我們的動態(tài)規(guī)劃數(shù)組的逐步求解過程著手分析,定義數(shù)組f[j]暂刘。
????(1)當(dāng)我們不考慮“裝滿條件時(shí)”饺谬,直接將數(shù)組初始狀態(tài)全部置為0,表示在僅有前0件物品可供選擇時(shí)谣拣,對于背包承重從0至W(max)都有一個合法解募寨,那就是裝入0件物品到背包
????(2)如果考慮了“裝滿條件”呢森缠,我們還可以把數(shù)組初始狀態(tài)全部置為0嗎拔鹰?顯然不能,因?yàn)槌吮嘲兄貫?這種情況其他的都不滿足“裝滿條件”贵涵,0件物品恰好裝滿承重為0的包列肢,卻不能裝滿承重為j (j!=0)的包。所以f[j]的初始化狀態(tài):f[0]=0宾茂,f[j]=Integer.minValue (j!=0);
????(3)為什么要選擇置為Integer.minValue呢瓷马?由f[j]=Math.max(f[j],f[j-w[i]]+v[i])知,第i步的最優(yōu)解都是根據(jù)第i-1步推得跨晴,要想第i步獲得的結(jié)果恰好裝滿欧聘,那么第i-1步也必須是恰好裝滿的最優(yōu)解,否則第i-1的解也應(yīng)該為Integer.minValue端盆,因?yàn)镮nteger.minValue+W[i]=Integer.minValue怀骤。
綜上:背包必須恰好裝至承重極限值即是要求f[j]的值為非Integer.minValue的合理范圍的實(shí)數(shù)(這個問題中是合理范圍的正整數(shù))!!!

Java代碼實(shí)現(xiàn)

public class Main{
    public static void main(String[] args) {    
        int totalWeight=5;//背包容量
        Treasure[] packages={new Treasure(200, 1),
                            new Treasure(100, 3),
                            new Treasure(300, 2),
                            new Treasure(150, 4),
                            new Treasure(350, 5)};
        System.out.println(solution(packages, totalWeight));    
    }

    //借用一維數(shù)組解決問題 f[w]=max{f[w],f[w-w[i]]+v[i]} 要求裝滿
    public static int solution(Treasure[] treasures,int totalVolume) {
        int maxValue=-1;
        //參數(shù)合法性檢查
        if(treasures==null||treasures.length==0||totalVolume<0){
            maxValue=0;
        }else {
            int tresureNum=treasures.length;
            int[] f=new int[totalVolume+1];
            //動態(tài)規(guī)劃數(shù)組初始化,重要;烂睢=住!
            for(int i=0;i<f.length;i++){
                if(i==0) f[i]=0;
                else f[i]=Integer.MIN_VALUE;
            }
            //動態(tài)求解
            for(int i=0;i<tresureNum;i++){
                int currentVolume=treasures[i].getVolume();
                int curentValue=treasures[i].getValue();
                for(int j=totalVolume;j>=currentVolume;j--){
                    f[j]=Math.max(f[j], f[j-currentVolume]+curentValue);
                }
            }
            maxValue=f[totalVolume];
            if(maxValue<0) maxValue=-1;
        }
        return maxValue;
    }
}

class Treasure{
    private int value;//價(jià)值
    private int volume;//重量
    public Treasure(int value,int volume) {
        this.setValue(value);
        this.setVolume(volume);
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public int getVolume() {
        return volume;
    }
    public void setVolume(int volume) {
        this.volume = volume;
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末访敌,一起剝皮案震驚了整個濱河市凉敲,隨后出現(xiàn)的幾起案子衣盾,更是在濱河造成了極大的恐慌寺旺,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件势决,死亡現(xiàn)場離奇詭異阻塑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)果复,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門陈莽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事走搁《栏蹋” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵私植,是天一觀的道長忌栅。 經(jīng)常有香客問我,道長曲稼,這世上最難降的妖魔是什么索绪? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮贫悄,結(jié)果婚禮上瑞驱,老公的妹妹穿的比我還像新娘。我一直安慰自己窄坦,他們只是感情好唤反,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嫡丙,像睡著了一般拴袭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曙博,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天拥刻,我揣著相機(jī)與錄音,去河邊找鬼父泳。 笑死般哼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惠窄。 我是一名探鬼主播蒸眠,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杆融!你這毒婦竟也來了楞卡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脾歇,失蹤者是張志新(化名)和其女友劉穎蒋腮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藕各,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡池摧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了激况。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片作彤。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡膘魄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竭讳,到底是詐尸還是另有隱情创葡,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布绢慢,位于F島的核電站蹈丸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏呐芥。R本人自食惡果不足惜逻杖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望思瘟。 院中可真熱鬧荸百,春花似錦、人聲如沸滨攻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽光绕。三九已至女嘲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诞帐,已是汗流浹背欣尼。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留停蕉,地道東北人愕鼓。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像慧起,于是被迫代替她去往敵國和親菇晃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359