算法分析与设计实验:01背包
时间:2020-04-21
本文章向大家介绍算法分析与设计实验:01背包,主要包括算法分析与设计实验:01背包使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题描述:
有N件物品和一个容量为V的背包。第i件物品的重量是weight[i],价值是value[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。注意,与背包问题不同的是,每件物品只有整个装入和不装入两个选项,且每件物品只能装入一次。
算法描述:
使用f(i,v)表示将前i个物品选择性装入剩余容量为v的背包时能得到的最大价值。这里我们把第i件物品和前i-1件物品分开来看,第i件物品只有装和不装两种选择。
1.如果不装的话剩余容量不减少,价值也不变,因此在这种情况下f(i,v)=f(i-1,v)
2.如果装的话则容量减少,价值增加,因此在这种情况下f(i,v)=f(i-1,v-weight[i])+value[i]
从自顶向下的视角看,如果装了第i个物品的话在下一层就要求解前i-1件物品在剩余容量减少的情况下的最大价值,如果没有装则要求解前i-1件物品在剩余容量不变的情况下的最大价值。
因此对于第i件物品的装和不装问题我们只要取两者的最大值就可以了。所以可以得到状态转移方程:
f(i,v)=f(i-1,v) (v<weight[i],即剩余容量不足,不能放入物品)
f(i,v)=f(i-1,v-weight[i])+value[i] (v>=weight[i],即剩余容量充足)
代码:
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 //f[i][v]=max{ f[i-1][v],f[i-1][v-w[i]]+val[i] } 6 //f[v]=max(f[v-weight[i]]+value[i],f[v]) 7 int solve(int n,int capacity,vector<int> &weight,vector<int> &value) 8 { 9 if(n<0||capacity<=0) 10 return 0; 11 vector<int> f(capacity+1); 12 for(int i=0;i<n;i++) 13 { 14 for(int v=capacity;v>0;v--) 15 { 16 if(v>=weight[i]) f[v]=max(f[v-weight[i]]+value[i],f[v]); 17 } 18 } 19 return f[capacity]; 20 } 21 22 int main() 23 { 24 int n,capacity; 25 cin>>n>>capacity; 26 vector<int> weight(n); 27 vector<int> value(n); 28 for(int i=0;i<n;i++) 29 { 30 cin>>weight[i]>>value[i]; 31 } 32 33 int ans=solve(n,capacity,weight,value); 34 cout<<ans<<endl; 35 return 0; 36 }
原文地址:https://www.cnblogs.com/misaka-cn-cs/p/12743480.html
- 可视化(番外篇)——在Eclipse RCP中玩转OpenGL
- 养良好C语言编程风格,编优质C语言代码,这才是C语言的开始
- IBM让《星球大战》中的各种黑科技变成现实
- 学习SVM(二) 如何理解支持向量机的最大分类间隔
- 解密区块链:不可编辑性带来的问题
- 学习SVM(三)理解SVM中的对偶问题
- 学习SVM(四) 理解SVM中的支持向量(Support Vector)
- 转行数据挖掘和机器学习(四)
- 了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult
- 学习SVM(五)理解线性SVM的松弛因子
- 了解ASP.NET MVC几种ActionResult的本质:EmptyResult & ContentResult
- 可视化(番外篇)——SWT总结
- 新年必看!预测2018年将是区块链爆发的行情
- 探秘Tomcat(一)——Myeclipse中导入Tomcat源码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法