深度优先搜索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 }
运行结果:


浙公网安备 33010602011771号