动态规划—0/1背包

问题描述:每种物品仅有一件,wi代表物体i的重量,pi表示物体i的价值,物体不可拆分,可以选择放或不放。背包总容量M,求怎么放才能价值最大化?

分析:

java代码:

 1 public class Package01 {
 2
 3     //3个物体的重量
 4     public static int[] m = {3,4,5};
 5
 6     //物体的价值
 7     public static int[] p = {4,5,6};
 8
 9     //背包的总容量
10     public static int M = 10;
11
12     //最优解递推式
13     public static int[][] result = new int[4][M+1];
14
15     public static void main(String[] args){
16
17         for(int i=1;i<=3;i++){
18             for(int j=0;j<=10;j++){
19                 //如果背包的容量,放不下m[i],则不选m[i]
20                 if(m[i-1] > j)
21                     result[i][j] = result[i-1][j];
22                 else
23                 {
24                     //转移方程式:注意数组m和p的下标要-1,1~5对应0~4
25                     result[i][j] = Math.max(result[i-1][j], result[i-1][j - m[i-1]] + p[i-1]);
26                 }
27             }
28         }
29         //result[3][10]存的最大价值
30         System.out.print(result[3][10]);
31     }
32
33
34 }
时间: 2024-10-22 00:45:17

动态规划—0/1背包的相关文章

动态规划之01背包

动态规划的基本思想: 将一个问题分解为子问题递归求解,且将中间结果保存以避免重复计算.通常用来求最优解,且最优解的局部也是最优的.求解过程产生多个决策序列,下一步总是依赖上一步的结果,自底向上的求解. 动态规划算法可分解成从先到后的4个步骤: 1. 描述一个最优解的结构,寻找子问题,对问题进行划分. 2. 定义状态.往往将和子问题相关的各个变量的一组取值定义为一个状态.某个状态的值就是这个子问题的解(若有k个变量,一般用K维的数组存储各个状态下的解,并可根    据这个数组记录打印求解过程.).

【动态规划】多重背包

贵有恒,何必三更起五更眠:最无益,莫过一日曝十日寒. [动态规划]多重背包 时间限制: 1 Sec  内存限制: 64 MB提交: 5  解决: 5[提交][状态][讨论版] 题目描述 张琪曼:“魔法石矿里每种魔法石的数量看起来是足够多,但其实每种魔法石的数量是有限的.” 李旭琳:“所以我们需要改变装包策略啦.” 现有N(N≤10)种魔法石和一个容量为V(0<V<200)的背包.第i种魔法石最多有n[i]件可用,每个占用的空间是c[i],价值是w[i].全部物品总数不超过50.求解将哪些魔法石

动态规划基础-----01背包(总结)

1.动态规划(DP) 动态规划(Dynamic Programming,DP)与分治区别在于划分的子问题是有重叠的,解过程中对于重叠的部分只要求解一次,记录下结果,其他子问题直接使用即可,减少了重复计算过程.  另外,DP在求解一个问题最优解的时候,不是固定的计算合并某些子问题的解,而是根据各子问题的解的情况选择其中最优的.  动态规划求解具有以下的性质:  最优子结构性质.子问题重叠性质   最优子结构性质:最优解包含了其子问题的最优解,不是合并所有子问题的解,而是找最优的一条解线路,选择部分

poj1417 带权并查集+0/1背包

题意:有一个岛上住着一些神和魔,并且已知神和魔的数量,现在已知神总是说真话,魔总是说假话,有 n 个询问,问某个神或魔(身份未知),问题是问某个是神还是魔,根据他们的回答,问是否能够确定哪些是神哪些是魔. 对于这些问题,我们只需要发现,如果回答对方是魔,那么即可以判断出这两个不是同一种族,而如果回答对方是神,那么说明这两个是同一种族,那么就可以用带权并查集合并这些神和魔,然后记录两种分别多少个,这样当所有询问都处理完时我们就可以得到一系列的集合,每个集合分别有它的两个种族的人数,但是此时对于每个

NOJ 1860 保研(0/1背包概率dp)

保研 时间限制(普通/Java):1000MS/3000MS         运行内存限制:65536KByte 总提交:171          测试通过:40 题目描述 对于一些名校而言,保研不仅可以由学校推免,也可以由学生自己向希望保研的学校提出申请,这个过程有点类似于外国学生向学校提交简历等待Offer的过程.但是,投递申请需要亲自去相应学校的研招办递交材料,这就需要一些成本(比如路费等),且每个院校都有自己的录取成功率.现在,请在总成本不超过限制的情况下,求出最大的成功率. 输入 输入

POJ 1636 Prison rearrangement DFS+0/1背包

题目链接: POJ 1636 Prison rearrangement Prison rearrangement Time Limit: 3000MS   Memory Limit: 10000K Total Submissions: 2194   Accepted: 984 Description In order to lower the risk of riots and escape attempts, the boards of two nearby prisons of equal

POJ 3628 Bookshelf 2 0/1背包和DFS两种解法

题目链接:POJ 3628 Bookshelf 2 Bookshelf 2 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7462   Accepted: 3436 Description Farmer John recently bought another bookshelf for the cow library, but the shelf is getting filled up quite quickly,

牛客网 TaoTao要吃鸡 ( 0/1背包变形 )

题意 : 题目链接 分析 :  如果没有 BUG (即 h == 0 的时候)就是一个普通的 0 / 1 背包 需要讨论一下 h != 0 的情况 此时有就相当于有物品是有特权的 而且背包装有特权的物品根据题目的要求是应当最后装的 也就是说特权物品装完之后背包将不再可装 所以特权物品肯定是只有一个的 数据量并不大,所以可以去枚举这个特权物品 那么如何知道在  没有装特权物品  之前的最佳选择方案? 答案就是用最小的可剩空间留给特权物品,然后其他空间去跑 0/1 背包 最小的可剩空间当然就是 h

浙大PAT CCCC L3-001 凑零钱 ( 0/1背包 &amp;&amp; 路径记录 )

题目链接 分析 : 就是一个 0/1 背包,但是需要记录具体状态的转移情况 这个可以想象成一个状态转移图,然后实际就是记录路径 将状态看成点然后转移看成边,最后输出字典序最小的路径 这里有一个很巧妙的做法 先将所有的硬币升序排序(这一点很重要) 然后在这一条件下,假设当前状态是考虑第 i 个硬币,前一个状态是考虑第 i-1 个硬币 试想对于同一个体积,如果选用的硬币数量越多是不是字典序更小 然后对于如果对于同一体积下,选用硬币数一样多的两种方案 由于我们已经升序排序,如果有一样多硬币的情况,那么