型別一:可分割性的物品
此型別為貪心問題
時間限制:
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。
輸出輸出每組測試資料中揹包內的物品的價值和,每次輸出佔一行。
樣例輸入
13 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)
樣例輸入
21 52 2
2 52 2
5 1
樣例輸出
no1
#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 對每個物品,都有選擇 不選兩個狀態,這樣解空間就可以描述...