C语言描述 动态规划 背包问题
动态规划作为不同于其他类型的问题,有着它自己的解题思路以及模型,以下将围绕模型以及解题思路两方面进行讲解。
1.模型:有已知推到未知,是我们常用的解题思路,好比数独中如果我们有了1~8那么剩下的格子必然是9了。
动态规划也是这样的思路,眼下我们有一堆货物和一个容量有限的背包,那么如何装才能利益最大化便是我们需要考虑的问题。也就是背包问题。
仔细思考,不难发现,每个物品都只有0与1(0表示不装,1表示装入)两个状态,那么一串二进制数就可以表示物品的装配方案(如0101表示只带上第2、4件物品)由此必有2^n(n件物品)方案
如此枚举时间过于复杂,由此如何优化就成为了需要思考的问题,那么我们继续思考上面解题是枚举装配方案,如果我们能够优化装配判断的条件就可以达到优化的目的。如何判断呢?显然当我们在判断第i件物品时,肯定会选择上一次最佳方案(相同体积价值最高)再加上这一次的成本,也就是说我们当前装入与否取决于我们是否装得下,装不下显然我们跳过,装得下我们就得判断是装入好还是不装入好。
2.解题
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
8
代码如下:
#include<stdio.h>int n, m;
int f[1001], v, w;int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= n; i ++){scanf("%d%d", &v, &w);for(int j = m; j >= v; j--)if(f[j]<f[j-v] + w)f[j] = f[j-v] + w;else f[j] = f[j];}printf("%d", f[m]);return 0;
}
C语言描述 动态规划 背包问题相关推荐
- 动态规划 NOIP经典问题 开心的金明(洛谷P1060题题解,Java语言描述)
题目要求 P1060题目链接 分析 经典的0/1背包问题,<背包九讲>中提到的典例. 动态转移方程:f[j]=Math.max(f[j],f[j−v[i]]+w[i])f[j] = Mat ...
- 动态规划求解装箱问题(洛谷P1049题题解,Java语言描述)
题目要求 P1049题目链接 分析 这种题不能贪心,大家都懂的,应该使用DP. 比如容量为7,有三个物品体积是1,2,5,你要是先装小的,就只能装3,剩下4,但实际上可以装的只剩一个. 如果容量为10 ...
- 动态规划求解限时采药问题(洛谷P1048题题解,Java语言描述)
题目要求 P1048题目链接 分析 荐读:大神博文 -> <聊聊动态规划与记忆化搜索> 这题就是一个标准的DP水题,对于不会DP的萌新,太难了!对于整天搞DP的算法大佬,水爆了! 荐 ...
- 动态规划求解疯狂的采药问题(洛谷P1616题题解,Java语言描述)
题目要求 P1616题目链接 分析 参考这篇文章自己做出来的 → Here 我就不讲了. AC代码(Java语言描述) import java.util.Scanner;public class Ma ...
- 贪心 or 动态规划 求解“最大字段和”问题(洛谷P1115题题解,Java语言描述)
题目要求 P1115题目链接 分析 练习DP,势在必行! 状态转移方程:f[i]=max(f[i−1]+n[i],n[i])f[i]=max(f[i-1]+n[i], n[i])f[i]=max(f[ ...
- 递归不行就换动态规划(洛谷P1028题题解,Java语言描述)
题目要求 P1028题目要求 分析 我们可以用递归做,但可能会超时或者超内存.最起码不算好的算法. 那么我们就可以考虑找到递推规律,利用简单的DP处理. 在迭代的时候发现:(i >= 2) i为 ...
- 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案...
转自:http://www.linuxidc.com/Linux/2014-04/99735.htm 数据结构与算法分析:C语言描述(原书第2版中文版!!!) PDF+源代码+习题答案 数据结构与算法 ...
- 神奇的四次方数(洛谷P1679题题解,Java语言描述)
题目要求 P1679题目链接 分析 可以使用DP去做,当做"完全背包问题"问题来处理. 初值:f[0]=0f[0]=0f[0]=0 cost[]cost[]cost[] : cos ...
- [Catalan]求解随机出栈可能数(洛谷P1044题题解,Java语言描述)
题目要求 P1044题目链接 分析 题意就是:N个数依次进栈,可随机出栈,算一下可能的出栈序列数. 其实这个就是Catalan啊,如果数据结构与算法有一定的刷题积累的学生应该经常做这样的About栈的 ...
最新文章
- python list 查找find_List 泛型 集合中 Find 的用法
- 如何在已安装TMG2010服务器上安装Symantec Backup Exec 2010 Remote Agent
- Android 抖动提示动画
- Java BigInteger类| toByteArray()方法与示例
- css中的背景、边框、补丁相关属性
- Qt QString to char*
- 打印准考证服务器异常显示,注意了!打印准考证时,你可能遇到这些问题!
- html添加田字,兆加页(是加三个田是什么字)
- 高数·两个重要极限练习
- 在48小时内了解智能制造,让你少走弯路
- 齿轮-转子-轴承系统动力学matlab程序代码
- 数加加众包实习生招募进行中
- 音频知识点(12)- P.563 工具编译及使用教程
- Picture Collage Maker Mac(图片拼贴软件) 中文激活版
- 内部排序算法比较-数据结构C语言课设
- Vue中通过配置eslintrc.js文件来解决编译时出现的no-trailing-spaces、no-undef等错误
- MSP430F149程序——12864液晶
- Pytorch resnet花朵识别(5种花)附完整代码
- Linux 和uboot下dd命令读写sd,mmc,mm读写内存命令
- 白盒测试技术详细,有例题——软件质量保证与测试