揹包問題大部分是這樣的:有乙個容量為v的揹包和一些物品。這些物品有兩個屬性,體積w和價值v,每種物品只有乙個。
要求用這個揹包裝下價值盡可能多的物品,求其最大價值。因為在最優解中,每個物品都有兩種可能的情況,即在揹包中存在
或者不存在(揹包中有0個或者1個該物品),因而被稱為0-1揹包問題。
採藥
辰辰是個很有潛能、天資聰穎的孩子,他的夢想是稱為世界上最偉大的醫師。 為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。 醫師把他帶到個到處都是草藥的山洞裡對他說: 「孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。 我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可以讓採到的草藥的總價值最大。」 如果你是辰辰,你能完成這個任務嗎?
輸入的第一行有兩個整數t(1 <= t <= 1000)和m(1 <= m <= 100),t代表總共能夠用來採藥的時間,m代表山洞裡的草藥的數目。接下來的m行每行包括兩個在1到100之間(包括1和100)的的整數,分別表示採摘某株草藥的時間和這株草藥的價值。
可能有多組測試資料,對於每組資料,示例1輸出只包括一行,這一行只包含乙個整數,表示在規定的時間內,可以採到的草藥的最大總價值。
70 371 100
69 1
1 2
3
1 #include 2 #include 34int max( int a,intb)5
89struct
e 10
list[101
];14
int dp[1001
];15
16int
main()
1731 printf("
%d\n
",dp[s]);32}
3334
return0;
35 }
這裡採用倒序更新是為了保證更新dp[j]
時,dp[ j-list[i].w ]的狀態尚未因此次更新而發生改變。
揹包問題之01揹包
01揹包就是說針對每一件物品,有選擇裝入或者放棄,是屬於動態規劃類的問題。現在假設我們有m件物品,各有價值,揹包承重為10,假設當前可用的承重量為v,當前在抉擇第m件物品是否放入,重量為w1,價值為v1,那麼,如果不放入,我們的價值應該保持不變,並與之前算出的最大價值相同,如果放入,放入後的價值就是...
揹包問題之0 1揹包
0 1揹包是最基本的揹包問題,其核心思路就在於每個物品的放與不放 每個物品最多只能放一次 題目有 n 個物品和乙個大小為 m 的揹包.給定陣列 a 表示每個物品的大小和陣列 v 表示每個物品的價值.問最多能裝入揹包的總價值是多大?樣例輸入 m 10,a 2,3,5,7 v 1,5,2,4 輸出 9 ...
揹包問題之01揹包問題
題目 有n件物品和乙個容量為v的揹包。第i件物品的容量是c i 價值為w i 求解將哪些物品裝入揹包可以使得這些物品的費用總和不超過揹包容量,且價值總和最大。基本思路 作為最基礎的揹包問題,特點是 每種物品只有一件,可以選擇放或者是不放。用子問題定義狀態 f i v 表示前i件物品恰好放入乙個容量為...