0-1背包问题
来源:互联网 发布:方媛的淘宝店 编辑:程序博客网 时间:2024/06/03 20:56
问题描述:
有n个物品,重量分别为w1,w2…wn,价值分别为v1,v2…vn,书包的容量为C。
由于每件物品只能装入或者不装入两种状态,不能重复装入,所以称为0-1背包问题。
求解:如何选择装入的物品使装入的物品的总价值最大。
约束条件:装入书包的物品的重量之和小于书包的容量。
/*int w[N + 1] = {0,2,2,6,5,4}; //测试用例int v[N + 1] = {0,6,3,5,4,6};V[i][j] 表示前i个物品装入容量为j的背包中获得的最大价值,求解的过程就是从顶向下的不断的填充该二维数组,最终求得该问题的解。*/#include<iostream>#include<algorithm>using namespace std;#define N 5 //物品数量#define C 10 //书包容量int knapSack(int w[], int v[]){ int V[N + 1][C + 1]; for (int i = 0; i <= N; i++) V[i][0] = 0; //初始化第0列 for (int i = 0; i <= C; i++) V[0][i] = 0; //初始化第0行 for (int i = 1; i <= N; i++){ for (int j = 1; j <= C; j++) if (j < w[i]) V[i][j] = V[i - 1][j]; //物品i放不进去时 else V[i][j] = max(V[i - 1][j], V[i - 1][j - w[i]] + v[i]); //物品i放进去时 } //求解装入书包的物品 int x[N + 1]; //为1表示该下标指示的物品装入 int j = C; x[0] = 0; for (int i = N; i>0; i--){ if (V[i][j] > V[i - 1][j]) { //表示将i放进去了 x[i] = 1; cout<<i<<" "; //输出放入书包的物品的编号 j = j - w[i]; } else x[i] = 0; //表示i没放进去 } return V[N][C]; //返回背包取得的最大价值}int main(){ int w[N + 1] = {0,2,2,6,5,4}; int v[N + 1] = {0,6,3,5,4,6}; cout<<endl<<knapSack(w,v); //输出最大价值 return 0;}
0 0
- 背包问题(0-1背包、完全背包、多重背包)详解
- 背包问题和0-1背包问题
- 背包问题和0-1背包问题
- 背包问题系列--"0-1背包问题"
- 背包笔记-含0/1背包问题、完全背包问题、多重背包问题、二维背包问题、分组背包问题
- 【背包问题】背包问题之0-1背包、完全背包、多重背包
- 0-1背包问题
- 0/1背包问题
- 0,1背包问题
- 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- // 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- 0-1背包问题
- 0-1背包问题
- 0/1背包问题
- mac OS小工具使用
- Json概述以及python对json的相关操作
- -Dmaven.multiModuleProjectDirectory system propery is not set.
- Vuforia + Unity3d SDK开发-原理,前述
- scrapy 爬取网站并存入数据库实例
- 0-1背包问题
- 每日一记
- Java中导入、导出Excel
- 嵌入式开发第31、32天(项目2:用线程池实现大批量复制文件)
- 文章标题
- 自定义VIew之圆形百分比效果
- linux mips内核启动流程
- java生成word的几种方案
- Markdown 语法说明 (简体中文版)