演算法學習筆記之基礎dp之(0 1)揹包問題

2021-10-03 05:51:59 字數 2740 閱讀 7468

揹包問題:有多個物品,重量不同、價值不同,以及乙個容量有限的揹包,選擇一些物品撞到揹包中,問怎麼裝才能使裝進揹包的物品總價值最大。根據不同的的限定條件,可以報揹包問題分為很多種,常見的有下面兩種:

如果每個物品可以切分,稱為一般揹包問題,用貪心法求最優解。比如吃自助餐,在飯量一定的情況下,怎麼吃才能使吃到肚子裡的最值錢?顯然是從最貴的食物開始吃,吃完最貴的再吃第二貴的,這就是貪心。

例如 聖誕老人的禮物-santa clau』s gifts openj_bailian - 4110

聖誕節來臨了,在城市a中聖誕老人準備分發糖果,現在有多箱不同的糖果,每箱糖果有自己的價值和重量,

每箱糖果都可以拆分成任意散裝組合帶走。聖誕老人的馴鹿最多只能承受一定重量的糖果,

請問聖誕老人最多能帶走多大價值的糖果。

input

第一行由兩個部分組成,分別為糖果箱數正整數n(1 <= n <= 100),馴鹿能承受的最大重量正整數w(0 < w < 10000),兩個數用空格隔開。其餘n行每行對應一箱糖果,由兩部分組成,分別為一箱糖果的價值正整數v和重量正整數w,中間用空格隔開。

output

輸出聖誕老人能帶走的糖果的最大總價值,保留1位小數。輸出為一行,以換行符結束。

sample input

4 15

100 4

412 8

266 7

591 2

sample output

1193.0

#include

#include

#include

using

namespace std;

struct suger record[

101]

;bool

cmp(

const suger& a,

const suger& b )

//自定義結構體排序,按照平均價值從大到小

intmain()

sort

(record, record + n, cmp)

;// for (int i = 0; i < n; i++)

int sum =0;

double max =0;

for(

int i =

0; i < n; i++

)else

if(sum > w)

}printf

("%.1f\n"

, max)

;}

如果每個物體不可分割,成為0/1揹包問題。仍以自助餐為例,這次食物都是乙份份的,每乙份必須是吃完。如果最貴的乙份超過你的飯量,那只好放棄。這種問題無法用貪心求最優解。

01揹包問題描述:有編號分別為a,b,c,d,e的五件物品,它們佔據的空間量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,每件物品數量只有乙個,現在給你個空間量為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

考慮i號物品放還是不放

1:當i號物品要放入時,則f[i][v]=f[i-1][v-w[i]]+p[i],表示(p[i]表示i號物品的價值),前i-1次選擇後所選物品放入容量為v-w[i]的揹包所獲得最大價值為f[i-1][v-w[i]],加上當前所選的第i個物品的價值p[i]即為f[i][v]。

2當i號物品不放入時嗎,則f[i][j]=f[i-1][j]。則表示為前i-1次選擇所得的最大的價值。

所以,我們可以得出01揹包的遞推公式:f[i][v] = max

模板:

for

(int i =

1; i <= n; i++

)

一維陣列優化:

for

(int i=

1;i<=n;i++

)}

例題:hdu 2602 bone collector

已知n個糖果的重量和價值. 我們有乙個口袋, 最多可以裝v重量的糖果. 問口袋最多能放多少價值的糖果進去?

input

輸入的第一行是t, 表示有t組資料.

每組資料由三行組成.

第一行包含兩個整數n和v(n <= 1000, v <= 1000). n表示糖果的個數, v表示口袋的載重.

第二行包含n個整數, 表示每一顆糖果的價值.

第三行包含n個整數, 表示每一顆糖果的重量.

output

對每一組資料, 輸出口袋最終可以放進去糖果的價值.

sample input

15 10

1 2 3 4 5

5 4 3 2 1

sample output

14直接套模板即可

#include

#include

using

namespace std;

struct node node[

1010];

int t, n, v;

int dp[

1010][

1010];

intans()

}return dp[n]

[v];

}int

main()

return0;

}

揹包問題還有其他例如完全揹包和多重揹包

演算法學習筆記(二) 01揹包問題之回溯解法

揹包問題,相信各位看官肯定都有所耳聞!筆者就在此簡單的描述一下揹包問題 給定一揹包和n件物品,揹包的容量為c,第i件物品的重量為w i 價值為v i 1 i n 問裝那些物品,可使得價值最大?思路分析 顯然,每種物品不外乎兩種選擇 裝入和不裝入揹包!若將裝入用狀態1表示,不裝入用狀態0表示 那麼就可...

揹包dp之01揹包

現在我們有n個配件,他們有不同的價值.但是我們揹包的容量是有限的,因為我們只有乙個一級包,所以我們最多可以裝v重量的東西.但是為了能更好的吃到雞 不存在的 我們要攜帶更有價值的配件,請問我們最多能拿多少價值的配件來當快遞員呢?輸入的第一行是t,表示有一共要打t場比賽.每組資料由三行組成.第一行包含兩...

演算法學習之基礎題

基礎題之字串 題目 把手放在鍵盤上,稍不注意就會往右錯一位。q會變成w,j會變成k。輸入乙個錯位後敲出的字串,輸出打字員本來想打出的句子。分析 如何進行這樣的變換呢?一種方法是使用if語句或者switch語句,如if c w putchar q 但很明顯,這樣做太麻煩。乙個較好的方法是使用常量陣列。...