当前位置:网站首页>01背包问题(动态规划)
01背包问题(动态规划)
2022-08-02 03:28:00 【Aiolei】
1. 问题
有 n 个物品,它们有各自的重量 weight 和价值 value,现有给定容量 C 的背包,如何让背包里装入的物品具有最大的价值?每个物品只能使用一次。
2. 分析
需要求解的是:最大价值 MaxValue
约束条件:选择的物品总重量 < C
递推公式(面对当前物品可能有两种情况):
(1)包的容量比该物品体积小,装不下,此时的价值与前 i-1 个的价值是一样的,因此 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j] = dp[i-1][j] dp[i][j]=dp[i−1][j]
(2)可以装该物品,但装进去不一定是当前最大价值,比较装进去后和不装的价值大小,取较大的那一个,因此 d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w [ i ] ] + v [ i ] ) dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i]) dp[i][j]=max(dp[i−1][j],dp[i−1][j−w[i]]+v[i])
3. 代码
#include<iostream>
#include<cmath>
using namespace std;
int C; //背包容量
int number; //物品数量
int w[10], v[10]; //物品的重量和价值
int dp[10][10] = {
{
0}}; //保存价值的二维数组--动态规划
//找到最大价值
void MaxValue()
{
for(int i = 1;i <= number;i++){
//注意:i,j从1开始
for(int j = 1;j <= C;j++){
if(j < w[i]) //不能装
dp[i][j] = dp[i-1][j];
else //装
dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
}
}
}
int main()
{
cout<<"01背包问题"<<endl;
cout<<"Please input the bag's capacity:";
cin>>C;
cout<<"Please input goods' number:";
cin>>number;
cout<<"Please input goods' weight:";
for(int i = 1;i <= number;i++){
//注意:i从1开始
cin>>w[i];
}
cout<<"Please input goods' value:";
for(int i = 1;i <= number;i++){
cin>>v[i];
}
MaxValue(); //找到最大价值 -- 动态规划
cout<<"\n(1)动态规划\nThe bag's max vlaue is :"<<dp[number][C]<<endl;
cout<<"The values of dp[][] are as follows:\n";
for(int i = 0;i <= number;i++){
//输出dp数组
for(int j = 0;j <= C;j++){
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
4. 效果
边栏推荐
- 最简单的FRP内网穿透教程
- laravel 写api接口时 session获取不到处理办法
- Out of memory error on GPU 0. Cannot allocate xxxGB memory on GPU 0, available memory is only xxx
- laravel-admin 列表图片点击放大
- 关于我的项目-实现一个数据库~
- 二舅为什么能刷屏?这三件事对企业公关的启示
- 解决flex布局warp自动换行下最后一行居中问题
- 借贷记账法下的账户结构、借贷记账法的记账规则、借贷记账法下的账户对应关系与会计分录
- Visual Studio2022创建setup项目
- Debian 12 Bookworm 尝鲜记
猜你喜欢
对账、结账、错账更正方法、划线更正法、红字更正法、补充登记法
财产清查概述、 全面清查的情况、局部清查的情况、财产清查的方法、财产清查结果的处理
修复APP的BUG,热修复的知识点和大厂的相关资料汇总
BSN:Boundary-Sensitive Network for Temporal Action Proposal Generation论文阅读笔记
在 UUP dump 被墙的情况下如何用 UUP 下载 ISO 镜像
Binder机制详解(二)
机器学习预备知识
聊一聊数据库的行存与列存
Two-Stream Convolutional Networks for Action Recognition in Videos双流网络论文精读
自定义ViewGroup实现搜索栏历史记录流式布局
随机推荐
浅谈性能优化:APP的启动流程分析与优化
属性动画的使用和原理解析
laravel-admin 列表图片点击放大
SATA M2 SSD 无法安装系统的解决方法
laravel-admin 线上访问项目,一直重定向到登录页面
php laravel框架生成二维码
Mysql创建索引
面试必备:Android性能分析与优化实战进阶手册
还原最真实、最全面的一线大厂面试题
成本会计的概念、产品成本核算的要求、产品成本核算的对象与成本项目、产品成本的归集和分配(可能考判断)、产品成本计算方法 (三种:产品的品种(品种法),批次(分批法),步骤(分步法))
kotlin语法总结(二)
深度学习理论:测试集与验证集的区别及各自用途
解决flex布局warp自动换行下最后一行居中问题
Spark特征工程-one-hot 和 multi-hot
ffmpeg 有声视频合成背景音乐(合成多声音/合成多音轨)
Debian 12 Bookworm 尝鲜记
Larave 自定义公共函数以及引入使用
元宇宙:为何互联网大佬纷纷涉足?元宇宙跟NFT是什么关系?
SGDP(1)——猜数字游戏
关于我的大创、论文~