✨哈喽,进来的小伙伴们,你们好耶!✨
🛰️🛰️系列专栏:【蓝桥杯专项】
✈️✈️本篇内容:初识0/1背包问题!
🚀🚀码云仓库gitee:Java数据结构代码存放!
⛵⛵作者简介:一名双非本科大三在读的科班Java编程小白,道阻且长,你我同行!
动态规划(英语:Dynamic programming,DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
即有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。
第 i件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N行,每行两个整数 vi,wi,用空格隔开,分别表示第 i件物品的体积和价值。
输出一个整数,表示最大价值。
数据范围
0 输入样例 输出样例: 假设我们这里给定体积用V[i]来表示,价值用w[i]表示,那么如果我们想得到最大价值max,那么就要对这里的集合进行划分,假设我们规定总价值用f(i,j)来表示,那么就分两种情况: 1、不包含i; 2、包含i; 对于情况1:那么如果想得到最大价值,那么就必须在1~(i-1)的区间来寻找,所以问题也就等同于对f(i-1,j)取最大值。 对于情况2:那么这里如果包含i的话,那么对于每份的数据我们可以同时减去i,因为带i不好求最大值,就像一组学生成绩是排好序的,我们给这组成绩同时减去10分,那么也不会影响最终的排名,所以也就是f(i-1,j-Vi)+Wi;j表示我们的体积,我们去掉了第i组数据,所以要减去i的体积也就是Vi,那么考虑完这些之后,我们还要加上i的价值,因为我们这一组是包含i的,所以i的价值也是需要参与运算的,所以最后的最大值max = Math.max(f(i-1,j),f(i-1,j-Vi)+Wi);最终的代码如下: 代码实现: 运行结果:8