之前做過相關總結,再多說兩句;
01揹包必定是不能用貪心策略解決的。因為01揹包選了就沒有,而貪心則是可以選擇多種;
對於01揹包問題,只能用動態規劃;
這裡注意一下,最近遇到了關於01揹包的乙個小問題;
pat示例題目僅僅是涉及容量,並沒有涉及到價值,而有些機試題參照標準的揹包問題,同時涉及價值和容量;
1.對於簡單的設計容量,要求正好裝入多少東西,直接用簡單的dp陣列即可,dp二維陣列表示該容量下的能裝進的最大值;
2.對於涉及容量和價值的問題,則dp二維陣列表示該容量下能裝入的最大值,此時dp狀態轉移方程應該為:dp[j] = max(dp[j], dp[j - p[i]] + w[i]);
注意一下以下幾個點:
1.dp陣列二維,為dp[i][j],其中i代表前i個東西的放置情況,也可以表示第i件是否放入;而j代表當容量為j的時候,i到底放不放;
這裡一定要注意,所有索引i都從1開始,0代表前0件東西的放置情況,為邊界;所有狀態變換都要從i=1開始;
2.有一道pat的題目涉及到了排序問題,選擇字典序小的進行輸出,這涉及到轉換方程和初試序列排序判定的問題;
sort(vec + 1, vec + n + 1,cmp);
if (dp[v] <= dp[v - vec[i]] +vec[i]) else
主要是這兩段**:
如果使得輸入序列降序,則最小元素判定必在最後進行dp構造,此時當dp[v]和dp[v - vec[i]] + vec[i]判定為小於等於時,由於等於的存在,可以保證小元素序列會可以擠掉大元素序列;從而構成新的唯一狀態;
同理,如果是增序排序,則最大元素會把小元素擠掉,導致所構成的唯一最有狀態成為較大的狀態,為降序輸出,這個要注意一下;
3.注意二維dp和一維dp的問題:
二維dp也不是不可以,但是一維dp只用到上一層v索引和v左邊的所有元素,所以直接從右向左構造,可以保證每次構造完左邊的元素一直不動,可以省空間;
關鍵字:一維dp,從右向左構造;
動態規劃 揹包問題
給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...
動態規劃 揹包問題
不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...
動態規劃 揹包問題
1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...