当前位置:网站首页>暴力递归到动态规划 03 (背包问题)
暴力递归到动态规划 03 (背包问题)
2022-07-29 22:53:00 【涛涛英语学不进去】
1. 题目
有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
2. 暴力递归
如果剩余空间<0,则返回-1
如果选完最后一个,再选就直接返回0
对于一个物品,可以选,可以不选
如果不选,curIndex+1,这个物品直接跳过
如果选,判断返回来的值是不是 -1 ,如果不是,则添加新价值
public int getMaxValue(int[] weight, int[] value, int bagSize) {
return getValue(weight, value, bagSize, 0);
}
/** * 从左往右 01背包 * * @param weight 物品重量数组 * @param value 物品价值数组 * @param bagFreeSpace 背包剩余空间 * @param curIndex * @return */
private int getValue(int[] weight, int[] value, int bagFreeSpace, int curIndex) {
//如果剩余空间<0
if (bagFreeSpace < 0) {
return -1;
}
if (curIndex == value.length) {
//如果选完最后一个 value[value.length - 1]
return 0;
}
//如果当前物品不选,则直接选下一个
int unSelect = getValue(weight, value, bagFreeSpace, curIndex + 1);
//如果当前物品可以选
int select = 0;
int next = getValue(weight, value, bagFreeSpace - weight[curIndex], curIndex + 1);
if (next != -1) {
select = value[curIndex] + next;
}
//选择最大价值
return Math.max(unSelect, select);
}
2. 动态规划
dp数组,横向为选择的物品,纵向为当前背包容量
由递归的返回过程可知,当选完所有物品,即 curIndex == n , 则dp[ n ] [ curIndex] = 0
由下往上递归 (第 n - 1 行开始,第 n 行全部为0),从左往右循环
如果不选,为dp[i+1][j]
如果选,value[i] + dp[i + 1][j - weight[i]]
在连两者中选最大值
public int getMaxValue2(int[] weight, int[] value, int bagSize) {
int n = weight.length;
//横向为背包剩余空间
//纵向为当前选择的物品
int[][] dp = new int[n + 1][bagSize + 1];
//由暴力递归可知,当curIndex==n , 则为0
// Java 默认为0
for (int i = 0; i <=bagSize; i++) {
dp[n][i] = 0;
}
//物品
for (int i = n-1; i >= 0; i--) {
for (int j = 0; j <= bagSize; j++) {
//如果当前物品不选,则直接选下一个
int unSelect =dp[i+1][j];
//如果当前物品可以选
int select = 0;
if (j >= weight[i]) {
select = value[i] + dp[i + 1][j - weight[i]];
}
dp[i][j] = Math.max(unSelect, select);
}
}
return dp[0][bagSize];
}
public static void main(String[] args) {
int[] weights = {
3, 2, 4, 7};
int[] values = {
5, 6, 3, 19};
int bag = 11;
System.out.println(new Package().getMaxValue(weights, values, bag));
System.out.println(new Package().getMaxValue2(weights, values, bag));
}
边栏推荐
猜你喜欢

Foxmail是什么邮箱?

html+css+php+mysql实现注册+登录+修改密码(附完整代码)

The sequence table of the linear table (the dry goods are full of sharing ~ contains all the function codes of the sequence table~

华为14天-(3)内核开发

MySQL数据库进阶篇

【微信小程序】一文解忧,事件绑定

线性表之顺序表(干货满满的分享来啦~内含顺序表全部函数代码~

运动步数抽奖小程序开发

DNA修饰的上转换纳米材料|聚胞苷酸Poly-C DNA修饰的氧化石墨烯|解析说明

J9数字论:为什么我们需要Web3?
随机推荐
@Accessors 注解详解
DD5 进制转换
Qt之在QML中使用QSortFilterProxyModel进行排序和过滤
pnpm + workspace + changesets 构建你的 monorepo 工程
JetsonNano学习(六)Jetson踩过的大坑及解决方法___持续更新
Redis和MySQL如何保持数据一致性
We launched a "developer lab"
【面试:并发篇30:多线程:happen-before】
运动步数抽奖小程序开发
MySQL数据库进阶篇
kaniko --customPlatform参数:支持不同平台的镜像构建(如:arm等)
JZ18 删除链表的节点
C语言实现扫雷(9*9)游戏——详解
通信岗秋招准备
云计算1+X之openstack篇
50. Leetcode 】 【 Pow (x, n) (medium) (power) quickly
【leetcode】50. Pow(x, n)(中等)(快速幂)
viewpager fragment data refresh
将文件流转成file文件后使用luckysheet回显数据
暴力递归到动态规划 04 (数字字符串转化)