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

1、动态规划(DP)

  动态规划(Dynamic Programming,DP)与分治区别在于划分的子问题是有重叠的,解过程中对于重叠的部分只要求解一次,记录下结果,其他子问题直接使用即可,减少了重复计算过程。 
  另外,DP在求解一个问题最优解的时候,不是固定的计算合并某些子问题的解,而是根据各子问题的解的情况选择其中最优的。 
  动态规划求解具有以下的性质: 
  最优子结构性质、子问题重叠性质   
  最优子结构性质:最优解包含了其子问题的最优解,不是合并所有子问题的解,而是找最优的一条解线路,选择部分子最优解来达到最终的最优解。 
  子问题重叠性质:先计算子问题的解,再由子问题的解去构造问题的解(由于子问题存在重叠,把子问题解记录下来为下一步使用,这样就直接可以从备忘录中读取)。其中备忘录中先记录初始状态。

2、求解思路

  ①、将原问题分解为子问题(子问题和原问题形式相同,且子问题解求出就会被保存); 
  ②、确定状态:01背包中一个状态就是个物体中第个是否放入体积为背包中; 
  ③、确定一些初始状态(边界状态)的值; 
  ④、确定状态转移方程,如何从一个或多个已知状态求出另一个未知状态的值。(递推型)

3、01背包问题求解思路

  ①、确认子问题和状态 
  01背包问题需要求解的就是,为了体积V的背包中物体总价值最大化,件物品中第件应该放入背包中吗?(其中每个物品最多只能放一件) 
  为此,我们定义一个二维数组,其中每个元素代表一个状态,即前个物体中若干个放入体积为背包中最大价值。数组为:,其中表示前件中若干个物品放入体积为的背包中的最大价值。 
  ②、初始状态 
  初始状态为和都为0,前者表示前0个物品(也就是空物品)无论装入多大的包中总价值都为0,后者表示体积为0的背包啥价值的物品都装不进去。

我自己写的的没保存,只能把这个整来凑数了

伪代码

for(int t=1;t<=n;t++)
{
   for(int j=V;j>=v[t];j--)
   {
        dp[j]=max(dp[j],dp[j-v[t]]+w[t]);
    }
}

原文地址:https://www.cnblogs.com/Staceyacm/p/10798502.html

时间: 2024-11-05 07:26:50

动态规划基础-----01背包(总结)的相关文章

动态规划之01背包详解【解题报告】

01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻. 01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] } f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值. Pi表示第i件物品的价值. 决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ? 题目描述: 有编号分别为a,b

动态规划之01背包

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

动态规划之01背包(1)

洛谷P1048 采药 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:"孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大." 如果你是辰辰,你能完成这个任务吗? 输入输出格式 输入格式: 输入文件medic

动态规划(0-1背包)--- 组合总和

组合总和 377. Combination Sum IV (Medium) nums = [1, 2, 3] target = 4 The possible combination ways are: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1) Note that different sequences are counted as different combinations. Therefore the ou

HDU 1171 Big Event in HDU (动态规划、01背包)

Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 57986    Accepted Submission(s): 19484   Problem Description Nowadays, we all know that Computer College is the biggest departme

动态规划求解0-1背包

C代码实现如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int** DP(int num, int Weight, int*w, int *v); 5 void output(int *c, int *w, int weight, int **ptr, int num); 6 int main() 7 { 8 9 10 int w[] = {3, 4, 7, 8, 9}; 11 int v[] = {4, 5, 10, 11,

采药-动态规划(01背包)

采用一维数组进行优化 #include<cstdio> #include<algorithm> using namespace std; int w[105], v[105]; int dp[1005]; int main() { int m, n; scanf("%d%d", &m, &n); for(int i=1; i<=n; i++) scanf("%d%d", &w[i], &v[i]); fo

动态规划(0-1背包)---字符串按单词列表分割

字符串按单词列表分割 139. Word Break (Medium) s = "leetcode", dict = ["leet", "code"]. Return true because "leetcode" can be segmented as "leet code". 题目描述: ??给定一个字符串和一个单词数组,判断字符串是否能被单词数组中的单词分割 思路分析: ??dict 中的单词没有使用

HDU4815 Little Tiger vs. Deep Monkey——0-1背包

题目描述 对于n道题目,每道题目有一个分值,答对加分,答错不得分,你要和一个叫深猴的比赛,题目你可以假设成判断题(不是对就是错),深猴对于所有的题目都是随机选择一个答案,而你是有脑子的,求为了不输掉比赛(平局或你获胜)的可能性至少为p时你至少需要得到多少分,有t组数据,每次输入两行,第一行为n,p(有n道题目,n<=40, 不会输的可能性为p,0.0<=p<=1.0),第二行输入n个1~1000的整数,代表这n道题分别答对能获得的分数 样例输入 1 3 0.5 1 2 3 样例输出 3