揹包問題全解

2021-06-21 22:24:44 字數 2048 閱讀 5728

型別一:可分割性的物品

此型別為貪心問題

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:3 描述

現在有很多物品(它們是可以分割的),我們知道它們每個物品的單位重量的價值v和重量w(1<=v,w<=10);如果給你乙個揹包它能容納的重量為m(10<=m<=20),你所要做的就是把物品裝到揹包裡,使揹包裡的物品的價值總和最大。

輸入第一行輸入乙個正整數n(1<=n<=5),表示有n組測試資料;

隨後有n測試資料,每組測試資料的第一行有兩個正整數s,m(1<=s<=10);s表示有s個物品。接下來的s行每行有兩個正整數v,w。

輸出輸出每組測試資料中揹包內的物品的價值和,每次輸出佔一行。

樣例輸入

1

3 15

5 10

2 83 9

樣例輸出

65

方法一:對物品按單位價值進行排序,依次菜單位價值最大的

#include#include#includeusing namespace std;

struct node

;bool cmp(node a,node b)

int main()

else

printf("%d\n",total);

}return 0;

}

方法二:型別於dp

#include#define max(a,b) a>b?a:b

int main()

; scanf("%d %d",&s,&m);

for(i=0;i0;j--)

dp[j]=max(dp[j-1]+v,dp[j]);

} printf("%d\n",dp[m]);

}}

型別二:不可分割的物品且每個物品可以拿多次

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:4 描述

直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。

第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價值總和是多少。如果不能恰好裝滿揹包,輸出no

輸入

第一行: n 表示有多少組測試資料(n<7)。 

接下來每組測試資料的第一行有兩個整數m,v。 m表示物品種類的數目,v表示揹包的總容量。(0輸出

對應每組測試資料輸出結果(如果能恰好裝滿揹包,輸出裝滿揹包時揹包內物品的最大價值總和。 如果不能恰好裝滿揹包,輸出no)

樣例輸入

2

1 52 2

2 52 2

5 1

樣例輸出

no

1

#include#include#define max(a,b) (a)>(b)?(a):(b)

int main()

memset(result,0,sizeof(result));//注意初值為零

for (i=1;i<=n;i++)

for(j=v;j>=weight[i];j--)//注意拿一次這裡為降序

if (result[j-weight[i]]+value[i]>result[j])

result[j] = result[j-weight[i]]+value[i];

printf("%d\n",result[v]);

} return 0;

}

總結:如果單純的求最大值,則結果陣列初始化為零。

如果題目要求裝不滿揹包則輸出no,則結果陣列需要初始化為乙個極小的負值,假設揹包容量為v,最後判斷d[v]的正負,若為正,則恰好能裝滿揹包,為負,則不能裝滿揹包。

如果乙個物品可以拿多次,則為公升序

如果乙個物品可以拿一次,則為降序

揹包問題全記載

說明 部分揹包相對簡單不再贅述,後三者著重記錄一下0 1揹包問題,因為大同小異都是通用,核心思想是一樣的,尤其是利用一維陣列解決問題的辦法一定要記好。一 部分揹包問題 問題分析 即可以把物品分割開裝入,相對來說是最容易理解的 方法 貪心演算法,優先放入 價量比 價值除以質量 最大的,直到揹包不能再放...

DFS解01揹包問題

01揹包問題的dfs解法 直接dfs未剪枝 時間複雜度 o 2n nn 其原因是對任意的物品,都是選或者不選 兩次的情況 dfs三個形參 物品序號index,放進揹包的重量sumw,以及放進揹包的總價值sumc 主要搜尋路徑 序號為index的物品放入揹包時 序號為index的物品不放入揹包時 搜尋...

0 1揹包問題全解析

0 1揹包問題 給定n個重量為w1 w2 w3.wn,價值為v1 v2 v3.vn的物品,容量為c的揹包,求這個揹包可以裝下的價值最高的子集,每個物品只能使用一次 w 重量v 價值 c 5 容量 最佳子集為 2,1,2 12 10 15 37 對每個物品,都有選擇 不選兩個狀態,這樣解空間就可以描述...