0-1背包问题_动态规划

普通背包问题可以用贪心来解决,而0-1背包问题只能靠动态规划来做,而且在我们平时的做题中经常会遇到0-1背包问题的变形,所以有必要牢牢掌握0-1背包问题的思想和解题思路。

根据下面的图更可以找到应该选那些背包

下面是我根据此思路模拟的代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int array3[100];//价值
 4 int array1[100];//物品重量
 5 int capacity;//容量
 6  int n;//物品个数
 7  int array4[100]={0};//记录装那些物品
 8 int array2[100+1][100+1];//最大价值数组
 9 int V(int n,int array1[],int array3[]){
10    for(int i=0;i<=n;i++){
11     array2[i][0]=0;
12    }
13    for(int j=0;j<=capacity;j++){
14     array2[0][j]=0;
15    }
16    for(int i=1;i<=n;i++){
17     for(int j=1;j<=capacity;j++){
18         if(j<array1[i]){
19             array2[i][j]=array2[i-1][j];
20         }
21         else{
22             array2[i][j]=max(array2[i-1][j],array2[i-1][j-array1[i]]+array3[i]);
23         }
24     }
25    }
26    int m=capacity;
27    for(int i=n;i>0;i--){
28     if(array2[i][m]>array2[i-1][m]){//记录路径1为装入该物品
29         array4[i]=1;
30         m=m-array1[i];
31     }
32    }
33   return array2[n][capacity];
34 }
35 int main()
36 {
37     cout << "请输入不同物品的总个数(每个物品都不相同,即该类物品只有一个)";
38     cin >> n;
39     cout << "请依次输入物品的重量" << endl;
40     memset(array1,0,sizeof(array1));
41     for(int i=1;i<=n;i++){
42         cin >> array1[i] ;
43     }
44       cout << "请依次输入物品的价值" << endl;
45     memset(array3,0,sizeof(array3));
46     for(int i=1;i<=n;i++){
47         cin >> array3[i] ;
48     }
49     cout << "请输入背包的总容量";
50     cin >> capacity;
51      memset(array2,0,sizeof(array2));
52     cout << "可获的最大价值" << V(n,array1,array3) << endl;
53     cout << "需要装入的物品是:";
54     for(int i=1;i<=n;i++){
55         if(array4[i]==1){
56             cout <<"物品"<< i << " ";
57         }
58     }
59     return 0;
60 }

运行结果如下

总结:(1)很多0-1背包问题完全可以套此模板快速解决问题.(2)时间复杂度为o^n2。

原文地址:https://www.cnblogs.com/henuliulei/p/10041737.html

时间: 2024-10-07 06:47:42

0-1背包问题_动态规划的相关文章

【算法设计与分析】7、0/1背包问题,动态规划

/** * 书本:<算法分析与设计> * 功能:给定n种物品和一个背包,物品i的重量是Wi, 其价值为Vi,问如何选择装入背包的物品,使得装入背包的物品的总价值最大? * 文件:beiBao.cpp * 时间:2014年11月30日19:22:47 * 作者:cutter_point */ #include <iostream> #define SIZEBEIBAO 20 using namespace std; //这个背包问题的最优的子结构是 /* 首先这里一共有m种物品,背包

0/1背包问题与动态规划

假设背包容量M=9:(P1,P2,P3,P4,P5,P6)=(15,18,40,56,30,10);(W1,W2,W3,W4,W,5,W6)=(3,2,5,8,5,1). 算法思想 变量解释: F(i):Si中第一对序偶在数组中的位置(下标) l, h:Si-1的第一对序偶和最后一对序偶在数组中的位置,即F(i-1)和F(i)-1. k: Si-1中当前要加入Si的序偶的位置. u: 在Si-1能够产生Si1序偶的最后一个位置,即对于u+1<=v<= h的序偶(Pv,Wv),有Wv+wi>

《背包问题》 动态规划

问题描述: 一切都要从一则故事说起. 话说有一哥们去森林里玩发现了一堆宝石,他数了数,一共有n个. 但他身上能装宝石的就只有一个背包,背包的容量为C.这哥们把n个宝石排成一排并编上号: 0,1,2,-,n-1.第i个宝石对应的体积和价值分别为V[i]和W[i] .排好后这哥们开始思考: 背包总共也就只能装下体积为C的东西,那我要装下哪些宝石才能让我获得最大的利益呢? 思路分析: 这是动态规划中的经典问题. 核心状态为:dp[i][j] 表示将i件宝物放入容量为j的背包中可以得到的最大价值. 状态

动态规划算法实现部分——0/1背包问题

代码: import java.util.*; import java.util.Scanner; /* *动态规划思想解决0/1背包问题 */ public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); System.out.println("输入背包的容量"); int bagCap=in.nextInt(); //背包的容量 System.out.pri

动态规划算法求解0,1背包问题

首先我们来看看动态规划的四个步骤: 1. 找出最优解的性质,并且刻画其结构特性: 2. 递归的定义最优解: 3. 以自底向上的方式刻画最优值: 4. 根据计算最优值时候得到的信息,构造最优解 其中改进的动态规划算法:备忘录法,是以自顶向下的方式刻画最优值,对于动态规划方法和备忘录方法,两者的使用情况如下: 一般来讲,当一个问题的所有子问题都至少要解一次时,使用动态规划算法比使用备忘录方法好.此时,动态规划算法没有任何多余的计算.同时,对于许多问题,常常可以利用其规则的表格存取方式,减少动态规划算

【动态规划】01背包问题_两种解法

问题描述 0-1背包问题:给定\(n\)种物品和一背包.物品i的重量是\(w_i\),其价值为\(v_i\),背包的容量为\(C\).问:应该如何选择装入背包的物品,使得装人背包中物品的总价值最大? 在选择装人背包的物品时,对每种物品\(i\)只有两种选择,即装人背包或不装入背包.不能将物品\(i\)装入背包多次,也不能只装入部分的物品\(i\).因此,该问题称为0-1背包问题. 此问题的形式化描述是,给定\(C>0\),\(w_i>0\),\(v_i>0\),\(1≤i≤n\),要求找

0-1背包问题(动态规划)

<span style="font-size:18px;">#include<iostream> #include<vector> #include<iterator> #include<algorithm> #include<string> using namespace std; /* *0-1背包问题(动态规划) */ vector<vector<int>> values;//valu

从01背包问题理解动态规划---初体验

01背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3.物品a1重量为3kg,价值为4:物品a2重量为4kg,价值为5:物品a3重量为5kg,价值为6.将哪些物品放入背包可使得背包中的总价值最大? 这个问题有两种解法,动态规划和贪婪算法.本文仅涉及动态规划. 先不套用动态规划的具体定义,试着想,碰见这种题目,怎么解决? 首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了. 其次,可以先把价值最大的物体放入

01背包问题【动态规划】

问题: 假设有n个物品,每个物品都是有重量的,同时每个物品也是有价值的,要求把这些物品放到一个背包中,这个背包的载重量是有限制的,怎么使得背包里面的物品总价值最大? 符号表示: N:物品个数 W:背包载重量 w[i]:物品i的重量(1<i<=N) v[i]:物品i的价值(1<i<=N) c[i, j]:到物品i为止,背包重量限制为j的最优解(1<i<=N, 1<j<=W) 分析: 最优解结构:对于物品i,只有两种情况,放入或不放入.假设物品i放入了是最优解的