当前位置:网站首页>动态规划解决0/1背包问题
动态规划解决0/1背包问题
2022-04-21 06:34:00 【萱萱不会秃头】
问题分析
动态规划与分治法类似,都是把大问题拆分成小问题,通过寻找大问题与小问题的递推关系,解决一个个小问题,最终达到解决原问题的效果。但不同的是,分治法在子问题和子子问题等上被重复计算了很多次,而动态规划则具有记忆性,通过填写表把所有已经解决的子问题答案纪录下来,在新问题里需要用到的子问题可以直接提取,避免了重复计算,从而节约了时间,所以在问题满足最优性原理之后,用动态规划解决问题的核心就在于填表,表填写完毕,最优解也就找到。
最优性原理是动态规划的基础,最优性原理是指“多阶段决策过程的最优决策序列具有这样的性质:不论初始状态和初始决策如何,对于前面决策所造成的某一状态而言,其后各阶段的决策序列必须构成最优策略”。
解决方案:
①确定子问题:定义一个函数v[i,j]表示的是前i个物品装入容量为j的背包中获得的最大价值
②建立子问题之间的关系:第一种是第i件物品没有装进去,第二种是第i件物品装进去了。当背包的剩余容量比该物品体积小,装不下,此时的价值与前i-1个的价值是一样的,也就是v[i,j]=v[i-1,j];否则就是,第i件物品如果不放入,此时此时的价值与前i-1个的价值是一样的,也就是v[i,j]=v[i-1,j],如果放进去,此时的价值为加上第i件物品的价值v[i,j]=V[i-1][j-weight[i-1]]+value[i-1],两者取最优解。
③确定边界条件:边界条件,不管是放入的物品为0,还是背包的容量为0,此时背包获得的最大价值都为0,即v[0,j]=0,v[i,0]=0。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int V[100][100];//定义一个函数V[i,j],表示前i个物品装入容量为j的背包中获得的最大价值
int max(int a,int b){
if(a>=b)
return a;
else return b;
}
int KnapSack(int n,int weight[],int value[],int C){
//填表,其中第一行和第一列全为0,即 V(i,0)=V(0,j)=0;
//边界条件,不管是放入的物品为0,还是背包的容量为0,此时背包获得的最大价值都为0
for(int i=0;i<=n;i++)
V[i][0]=0;//i个物品放入容量为0的背包中,价值为0
for(int j=0;j<=C;j++)
V[0][j]=0;//不放入物品 ,价值为0
//用到的矩阵部分V[n][C] ,下面输出中并不输出 第1行和第1列
printf("编号 重量 价值 "); //菜单栏 1
for(int i=1;i<=C;i++)
printf(" %2d ",i);
printf("\n\n");
for(int i=1;i<=n;i++){
printf("%2d %2d %2d ",i,weight[i-1],value[i-1]); //菜单栏 2 (weight与value都是从0开始存的,所以开始i=1时对应0的位置)
for(int j=1;j<=C;j++){
if(j<weight[i-1]){
//包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的
V[i][j]=V[i-1][j];
printf("%2d ",V[i][j]);
}
else{
//还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个
V[i][j]=max(V[i-1][j],V[i-1][j-weight[i-1]]+value[i-1]);//v[i-1][j],第i个物品不放入背包的价值;
//V[i-1][j-weight[i-1]]+value[i-1] 第i个物品放入背包,加上现在的价值。
printf("%2d ",V[i][j]);
}
}
printf("\n");
}
return V[n][C];
}
void Judge(int C,int n,int weight[]){
//判断哪些物品被选中
int j=C;
int *state=(int *)malloc(n*sizeof(int));
for(int i=n;i>=1;i--){
if(V[i][j]>V[i-1][j]){
//如果装了就标记,然后减去相应容量 ,背包现在的价值大于前一项的价值
state[i]=1;
j=j-weight[i-1];//减去相对应的容量
}
else
state[i]=0;
}
printf("选中的物品是:");
for(int i=1;i<=n;i++)
if(state[i]==1)
printf("%d ",i);
printf("\n");
}
int main(){
int n; //物品数量
int Capacity;//背包最大容量
printf("请输入背包的最大容量:");
scanf("%d",&Capacity);
printf("输入物品数:");
scanf("%d",&n);
int *weight=(int *)malloc(n*sizeof(int));//物品的重量
int *value=(int *)malloc(n*sizeof(int)); //物品的价值
printf("请分别输入物品的重量:");
for(int i=0;i<n;i++)
scanf("%d",&weight[i]);
printf("请分别输入物品的价值:");
for(int i=0;i<n;i++)
scanf("%d",&value[i]);
int s=KnapSack(n,weight,value,Capacity); //获得的最大价值
Judge(Capacity,n,weight); //判断那些物品被选择
printf("最大物品价值为: ");
printf("%d\n",s);
return 0;
}
版权声明
本文为[萱萱不会秃头]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_53954158/article/details/118058403
边栏推荐
- Build a deep learning server and environment configuration from scratch
- 任意用户注册&任意用户密码修改
- 什么是WebSocket
- Unity关于IsPointerOverGameObject接口真机失效问题
- One day study notes
- 21 jours de combat réel caffe 1 - 7 jours notes d'étude 1
- 蕊源电源芯片,RY3715,RY3750替换:矽力杰SY7208、SY7152、芯朋微AP2008.芯源MP1542,MP3213。2.5V至5.5V的输入电压
- JS different time format conversion
- Installation of performance testing tool JMeter & JProfiler
- 排序方式(1)==>冒泡排序,简单的选择排序
猜你喜欢

Export excel custom style with hutool tool ----- excel compression jar

OA vulnerability recovery manual

任意用户注册&任意用户密码修改

MS12_020漏洞

网络安全设备常见弱口令

2020-12-25

大型网站演变全过程与架构设计详解

CS5801规格书|CS5801HDMI转EDP转换方案|HDMI转DP转接板设计,HDMI2.0转EDP1.4,支持向下兼容

龙讯系列视频转换,LT9211、LT8918,功能:lvds转BT656,lvds转mipi(CSI\DSI)RGB转MIPI(DSI\CSI) BT656\601\1120转HDMI1.4\DVI
![[hand pose estimation] [paper accuracy] pose guided structured region ensemble network for cascaded hand pose estimation](/img/05/3058ef0519caf82573954b6195e5e7.png)
[hand pose estimation] [paper accuracy] pose guided structured region ensemble network for cascaded hand pose estimation
随机推荐
How to use keil5 to develop MSP430 and TIVA series development boards
[hand pose estimation] [paper accuracy] pose guided structured region ensemble network for cascaded hand pose estimation
Jfinal hutool tool excel util ziputil realizes exporting excel and compressing files
Mmdetection uses custom dataset training to convert datasets to coco format
OSS upload
MS1836S,HDMI转CVBS,视频转换器,HDMI接收器,内置 MCU 和存储器
教务管理信息系统 一键评价课程脚本
MySQL的安装与配置——详细教程
音频功率放大器,纳芯威功放,NS4165B单通道5.3W AB\D类功放,主要替换智浦芯的CS8571、CS8871、CS5218海栎创的HAA2018
字体图标网站---常用汇总
蕊源电源芯片,RY3715,RY3750替换:矽力杰SY7208、SY7152、芯朋微AP2008.芯源MP1542,MP3213。2.5V至5.5V的输入电压
Any user registration & any user password modification
CTF-RSA解密脚本
蓝桥杯——十六进制转八进制
任意用户注册&任意用户密码修改
Log4j Remote Code Execution Vulnerability verification
Weak password-20211221
文件系统结构分析与数据恢复
利用安全漏洞检测工具Metasploit对靶机Metasploitable2的Telnet登录提权
龙讯系列: LT8911,LVDS/MIPI DSI信号转换成EDP信号的转接芯片,LT8619,HDMI/MHL信号转换成LVDS/RGB信号