揹包問題:有多個物品,重量不同、價值不同,以及乙個容量有限的揹包,選擇一些物品撞到揹包中,問怎麼裝才能使裝進揹包的物品總價值最大。根據不同的的限定條件,可以報揹包問題分為很多種,常見的有下面兩種:
如果每個物品可以切分,稱為一般揹包問題,用貪心法求最優解。比如吃自助餐,在飯量一定的情況下,怎麼吃才能使吃到肚子裡的最值錢?顯然是從最貴的食物開始吃,吃完最貴的再吃第二貴的,這就是貪心。
例如 聖誕老人的禮物-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 但很明顯,這樣做太麻煩。乙個較好的方法是使用常量陣列。...