c++ 动态规划-01背包

article/2025/10/3 1:49:45

                                       动态规划 - 01背包问题

1.使用递归遍历(穷举)求解:

      01背包问题:给定 n 种物品和一个重量(容量)(限定条件)为 w 的背包,物品 i 的重量是 wi,其价值为 vi。(每种物品只有一个)问:如何选择装入背包的物品,使得装入背包中的物品的价值最大。

//VC6.0--------------------------
#include"stdafx.h"
#include <cmath>
#include <iostream>
using namespace std;//----------全局变量------------
#define n 4	//number     //物品数量
#define max_w 9	//weight //可承受重量(最大重量)
int value[n]={2,3,4,5};  //物品价值
int weight[n]={3,4,5,6}; //物品重量
//最大价值   以及解向量
int max_v=0;  int x[n]={0};
int nx[n]={0}; //当前解的情况
//-----------------------递归-----------------------
void beibao01(int i,int v,int w) //第i个物品  总价值  总重量
{//物品已遍历完毕if(i>n-1) return;   //将第i个物品放入 改变解向量 if((w+weight[i]) <= max_w){nx[i]=1;//如果大于之前的解的最大价值  则更新最大价值以及解向量if((v+value[i]) > max_v){max_v = v+value[i];for(int k=0;k<n;k++) x[k]=nx[k];}beibao01(i+1,v+value[i],w+weight[i]);}//不放第i个物品  刷新解向量 for(int k=i;k<n;k++) nx[k]=0;beibao01(i+1,v,w);
}//------------------------------------------------------
void main()
{beibao01(0,0,0);//输出答案cout<<max_v<<endl;for(int k=0;k<n;k++) cout<<x[k]<<" ";
}

max_w=8: 

 

2. 动态规划算法求解

//VC6.0--------------------------
#include "stdafx.h"
#include <cmath>
#include <iostream>
using namespace std;int max(int a,int b){if(a>b) return a;else return b;
}
void solution(int i,int j);//----------全局变量------------
#define n 4	    //number //物品数量
#define max_w 9	//weight     //可承受重量(最大重量)
int value[n]={2,3,4,5};      //物品价值
int weight[n]={3,4,5,6};     //物品重量int max_v=0;  int x[n]={0};  //最大价值   以及解向量
int real_w=0;                //包含最大价值背包的实际重量
//动态规划表 dynamic programming table
int dpt[n][max_w+1]={0};     // dpt[i][j]=k 表示前i个物品装在承重为j的背包中的最大价值为k//-----------------------状态转移方程-----------------------
//不考虑单个物品重量超过max_w  不考虑单个物品价值为0  等特殊情况
void beibao01() //解出动态规划表以及 最大价值 背包实际重量 解向量
{int i,j;//先填写第一行表for (j = 0; j <= max_w; j++)if(j >= weight[0])dpt[0][j] = value[0];elsecontinue;//由递推式 填完表for (i = 1; i < n; i++) {for (j = 1; j <= max_w; j++) {//容量为j的背包装不下 第i个物品if (j < weight[i])dpt[i][j] = dpt[i-1][j];//能装下 装完第i个物品之后背包重量为j   则其价值为 dpt[i-1][现在重量-第i物品重量] + 第i物品价值else{//取其最大值 即为最优子策略dpt[i][j] = max(dpt[i-1][j], dpt[i-1][j-weight[i]] + value[i]);if(dpt[i][j] > max_v){max_v = dpt[i][j];real_w = j;}}}}//求一个最优解solution(n-1,real_w);
}
//----------求解向量-------------
void solution(int i,int j)
{//第一个物品是否放入背包?if(i == 0){//没有放入if(j == 0) x[i] = 0;else x[i] = 1;}else{//第i个物品没有放入包内 寻找上一个最优子策略if(dpt[i][j] == dpt[i-1][j]){x[i] = 0;solution(i-1,j);}//第i个物品放入了包内  寻找上一个最优子策略else{x[i] = 1;solution(i-1,j-weight[i]);}}
}
//------------------------------------------------------
void main()
{int i,j;beibao01();//输出答案cout<<"物品价值:"<<endl;for (i = 0; i < n; i++) cout<<value[i]<<" ";cout<<endl;cout<<"物品重量:"<<endl;for (i = 0; i < n; i++) cout<<weight[i]<<" ";cout<<endl;cout<<"动态规划表:"<<endl;for (i = 0; i < n; i++) {for (j = 0; j <= max_w; j++) {cout << dpt[i][j] << ' ';}cout << endl;}cout<<"实际重量:"<<real_w<<endl;cout<<"最大价值:"<<max_v<<endl;cout<<"解向量:";for(int k=0;k<n;k++) cout<<x[k]<<" ";cout<<endl;
}

max_w=8:

max_w=9:

3.对2进行简化

//VC6.0--------------------------
#include "stdafx.h"
#include <cmath>
#include <iostream>
using namespace std;
//----------全局变量(输入信息)------------
#define n 4		     //数量
#define max_w 8	             //最大重量
int value[n]={2,3,4,5};      //价值
int weight[n]={3,4,5,6};     //重量//----------最大值函数--------
int max(int a,int b){if(a>b) return a;else return b;
}
//-----------------------填写动态规划表-----------------------
int beibao01(int *x) 
{int i,j;int dpt[n][max_w+1]={0};  //动态规划表int max_v;                //最大价值int real_w;               //实际重量//--------------第一行------------for (j = 0; j <= max_w; j++)if(j >= weight[0])dpt[0][j] = value[0];//--------------其余行------------for (i = 1; i < n; i++) {for (j = 1; j <= max_w; j++){if (j < weight[i])dpt[i][j] = dpt[i-1][j];else{dpt[i][j] = max(dpt[i-1][j], dpt[i-1][j-weight[i]] + value[i]);}}}//求最大价值 以及实际重量for (j = 1; j <= max_w; j++){if(dpt[n-1][j] > max_v){max_v = dpt[n-1][j];real_w = j;}}//求一个最优解for (i = n-1; i > 0; i--) {if(dpt[i][real_w ] != dpt[i-1][real_w ]){x[i] = 1;real_w = real_w-weight[i];}}if(real_w != 0) x[0] = 1;//返回最大值return max_v;
}//------------------------------------------------------
void main()
{//解向量int x[n]={0};//输出答案cout<<"最大价值:"<<beibao01(x)<<endl;cout<<"解向量:";for(int k=0;k<n;k++) cout<<x[k]<<" ";cout<<endl;
}

max_w=8: 

 

 参考博文:https://blog.csdn.net/qq_38410730/article/details/81667885


http://chatgpt.dhexx.cn/article/m03sukGp.shtml

相关文章

动态规划——01背包问题(C++实现)

题目描述&#xff1a; 解题思路&#xff1a; 整体思路&#xff1a; 利用动态规划&#xff0c;其目的就是将原问题分解成几个子问题&#xff0c;通过求解简单的子问题&#xff0c;把原问题给解决&#xff0c;就比如斐波那契数列方程&#xff1a; f[i]f[i-1]f[i-2]; 动态规划的…

动态规划总结三01背包问题

01背包问题一般是利用动态规划进行解题的&#xff0c;这里通过leetcode1049来讲解01背包的解题思路以及如何对01背包应用题目转换和理清思路 01背包问题&#xff1a; 这里借用学习公众号代码随想录的一张图来说明背包问题的种类 对于面试的话&#xff0c;其实掌握01背包&…

dp 动态规划 01背包问题 Python

参考学习网址&#xff1a; https://www.bilibili.com/video/av33930433?fromsearch&seid10637513335818789097 https://www.cnblogs.com/anzhengyu/p/11408466.html 问题描述&#xff1a; 给定 n 件物品&#xff0c;物品的重量为 w[i]&#xff0c;物品的价值为 v[i]。现…

Python3使用动态规划处理01背包问题

文章目录 视频教程讲解题目介绍题解1&#xff1a;二维列表题解2&#xff1a;一维列表&#xff08;滚动数组&#xff09;延伸阅读 视频教程讲解 【Python算法系列】动态规划2-01背包问题&完全背包问题【Python算法实战】背包问题 题目介绍 原题链接&#xff1a;NC145 01背…

算法 动态规划 01背包问题

01背包 问题分析代码实现从前往后拿&#xff0c;递归实现非递归实现非递归实现&#xff0c;自上向下填充 允接上一文章内容&#xff1a; 算法 动态规划: link. 问题分析 按照普通思维&#xff0c;首先想到应该为贪心算法&#xff0c;也就是计算每个物品重量价值比&#xff0c;…

【动态规划】01背包问题

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位喜欢写作&#xff0c;计科专业大二菜鸟 &#x1f3e1;个人主页&#xff1a;starry陆离 &#x1f552;首发日期&#xff1a;2022年5月16日星期一 &#x1f30c;上期文章&#xff1a;【动态规划】最长上升子序列 &#x1f4…

01背包问题:图表法带你快速理解动态规划解决01背包问题 附C++源码

0-1背包问题 所谓0-1背包问题&#xff0c;也就是给你一个重量为M的背包和n种物品&#xff0c;每种物品有一定的重量和价值&#xff0c;在每种物品均可装入背包1次或不装入&#xff08;不能仅装入物品的一部分&#xff09;且不超过背包载重量的前提下&#xff0c;问你怎样选择物…

动态规划——0/1背包问题(全网最细+图文解析)

✨动态规划——0/1背包问题(全网最细图文解析) 作者介绍: &#x1f393;作者:青花瓷✨ &#x1f440;作者的Gitee:代码仓库 &#x1f4cc;系列文章推荐: ✨1.数据结构与算法—算法篇之动态规划(一) ✨2.【Java刷题特辑第一章】——【点进来花两把游戏的时间学习晚上睡觉都踏实了…

【动态规划】01背包问题(通俗易懂,超基础讲解)

问题描述 有n个物品&#xff0c;它们有各自的体积和价值&#xff0c;现有给定容量的背包&#xff0c;如何让背包里装入的物品具有最大的价值总和&#xff1f; 为方便讲解和理解&#xff0c;下面讲述的例子均先用具体的数字代入&#xff0c;即&#xff1a;eg&#xff1a;numbe…

java事务和分布式事务详解

目录 事务问题 1 Java事务的类型 2 spring事务实现源码分析 事务问题 面试经常会问到分布式锁、分布式事务、SOA 服务化、分布式系统等业务、架构的问题和解决方案&#xff0c;工作中接触的业务方面事关金融&#xff0c;也需要解决一些类似的业务问题&#xff0c;所以总结…

JAVA事务配置总结

JAVA事务配置总结 使用hibernate&#xff1a;1.本地事务动态数据源单sessionFactory 这种情况属于大部分项目配置&#xff0c;在这里不多谈 2.全局事务动态数据源单sessionFactory 数据库分库分表时使用&#xff0c;已解决了不同库中相同名字的表相同ID的数据同时出现在同一…

Java事务回滚问题:抛出异常事务,并返回给前端异常信息

1、背景 修改bug。 之前的开发写的只能单选&#xff0c;所以逻辑都是按照只需要传递一个id值的逻辑写的 现在改为多选时&#xff0c;传递过来的是id数组&#xff0c;所以直接原逻辑的外层加了一个循环&#xff0c;这样原逻辑包括sql就不需要大变动&#xff0c; 但是这样会有个…

java事务中使用try catch 导致事务不回滚的问题

Transactional注解的触发&#xff0c;只回滚RuntimeException和Error异常&#xff0c;默认不回滚非RuntimeException异常 解决方法&#xff1a; 1.方法前添加注解&#xff08;基础的 Transactional注解&#xff1a;只能拦截RuntimeException和Error异常&#xff09; Transa…

java中事务

1.开启事务 事务的四大特性 ACID是原子性&#xff08;atomicity&#xff09;、一致性&#xff08;consistency&#xff09;、隔离性 &#xff08;isolation&#xff09;和持久性&#xff08;durability&#xff09;的缩写。 事务的原子性&#xff1a;事务作为整体执行&#x…

Java事务的ACID属性和四种隔离级别和传播机制

事务的ACID属性 数据库管理系统中事务(transaction)的四个特性&#xff08;分析时根据首字母缩写依次解释&#xff09;&#xff1a;原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;、持久性&a…

java回滚失败_java事务回滚失败问题分析

Spring-Java事物回滚失效处理最近在做项目中,无意间发现有个类在抛事物回滚操作,数据也正常的插入到数据库当中了,于是仔细查看看一下具体原因。 一切还是要从Java的检查型异常和非检查型异常说起。 那么什么是检查型异常什么又是非检查型异常呢? 最简单的判断点有两个: 1…

java中事务特性_java事务的四大特性ACID

前言 对于要把事务在实际中使用好&#xff0c;需要了解事务的特性。 事务的四大特性主要是&#xff1a;原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 一、事务的四大特性 1.1原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位&a…

Java 事务的传播性(Transactional)

前言 事务的传播性是Spring特有的概念&#xff0c;是基于Spring AOP技术实现的&#xff0c;原本的方法不具备事务的功能&#xff0c;运用Spring AOP的方式动态的增加了事务的功能&#xff0c;来确保数据库的数据的一致性。 只要开启事务的方法发生调用关系就一定存在事务的传…

Java 事务应用

一&#xff0c; 事务的一些基础知识简单回顾一下&#xff0c;讲的不是很深入&#xff0c;网上博客很多。 1&#xff0c;关于事务的四大特性&#xff1a;原子性、隔离性、一致性、持久性 本文不再赘述&#xff1b; 2&#xff0c;事务的隔离级别&#xff1a;读未提交&#xff0c;…

Java事务管理

事务的ACID属性&#xff1a;原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily) ACID 特性 A&#xff08;原子性&#xff09;事务的原子操作单元&#xff0c;对数据的修改&#xff0c;要么全部执行&#xff0c;要么全部不执行&#x…