深度優先搜索DFS---01背包問題(1)


題目:

有n件物品,每件物品的重量為w[i],價值為c[i]。現在需要選出若干件物品放入一個容量為 V 的背包中,使得在選入背包的物品重量之和,不超過容量V的前提下,讓北歐保重物品的價值之和最大,求最大價值。(1<=n<=20)

輸入格式:

第一行要求給出 N個物品(1<=N<=20),和容量V;

第二行要求給出 N個物品的重量;

第三行要求給出 N個物品的價值。

輸出格式:

輸出物品的最大總價值MAXValue。

輸入樣例:

5 8

3 5 1 2 2

4 5 2 1 3

輸出樣例:

10

直接上代碼。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 const int maxn = 30;
 6 int n,v,MAXValue;//物品個數,背包容量
 7 int w[maxn] = {0},c[maxn] = {0}; //每件物品的重量為w[i],價值為c[i]
 8 
 9 void DFS(int index, int sumW, int sumC) {
10     if(index == n) { //完成對 n個 物品的選擇---遞歸邊界
11         MAXValue = max(MAXValue,sumC);//更新最大價值MAXValue
12         return ;
13     }
14     if(sumW + w[index] <= v)//“選擇”當前物品 ,不超過背包最大容量時
15         DFS(index+1,sumW + w[index],sumC + c[index]);
16     DFS(index+1,sumW,sumC);//“不選擇”當前物品
17 }
18 int main() {
19     cin>>n>>v;
20     for(int i = 0; i < n; ++i)
21         cin>>w[i];
22     for(int i = 0; i < n; ++i)
23         cin>>c[i];
24     DFS(0,0,0);//初始時為第 0件物品、當前總重量和總價值 均為0
25     cout<<MAXValue;
26     return 0;
27 }

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM