【题目链接】

ybt 1293:买书
OpenJudge NOI 2.6 6049:买书

【题目考点】

1. 动态规划:完全背包

完全背包求方案数

【解题思路】

该问题为完全背包求方案数的问题。

1. 状态定义

集合:每种书买多少本构成的方案
限制:在前多少种书中买,买书钱数
属性、条件:书价钱加和等于买书钱数
统计量:方案数
状态定义dp[i][j]:在前i种书中选书购买,总价钱为j元的方案数
初始状态:在前i种书中选书购买,总价格为0元的方案,就是不选书,有一种方案。即dp[i][0]=1

2. 状态转移方程

a[i]为第i种书的价钱
集合:在前i种书中选择书价钱加和为j的方案
分割集合:是否选择第i种书

  • 如果选择一本第i种书,接下来要在前i种书中选择书,价钱加和为j-a[i],方案数为:dp[i][j-a[i]]
  • 如果不选择第i种书,接下来要在前i-1种书中选择书,价钱加和为j,方案数为dp[i-1][j]
  • 两种情况的方案数加和,为在前i种书中选择书价钱加和为j的方案数,即dp[i][j] = dp[i][j-a[i]] + dp[i-1][j]

可以进行滚动数组优化。

【题解代码】

解法1:基本解法

#include<bits/stdc++.h>
using namespace std;
#define N 15
#define M 1005
int n, m, a[N] = {0, 10, 20, 50, 100};//a[i]:第i本书的钱数
int dp[N][M];//dp[i][j]:在前i种书中选书购买,总价钱为j元的方案数
int main()
{m = 4;//书的种类 cin >> n;for(int i = 0; i <= m; ++i)dp[i][0] = 1;for(int i = 1; i <= m; ++i)for(int j = 1; j <= n; ++j){if(j >= a[i])dp[i][j] = dp[i][j-a[i]] + dp[i-1][j];elsedp[i][j] = dp[i-1][j];}cout << dp[m][n];return 0;
}

解法2:滚动数组优化

#include<bits/stdc++.h>
using namespace std;
#define N 15
#define M 1005
int n, m, a[N] = {0, 10, 20, 50, 100};//a[i]:第i本书的钱数
int dp[M];//dp[i][j]:在前i种书中选书购买,总价钱为j元的方案数
int main()
{m = 4;//书的种类 cin >> n;dp[0] = 1;for(int i = 1; i <= m; ++i)for(int j = a[i]; j <= n; ++j)dp[j] = dp[j-a[i]] + dp[j];cout << dp[n];return 0;
}

信息学奥赛一本通 1293:买书 | OpenJudge NOI 2.6 6049:买书相关推荐

  1. 信息学奥赛一本通 1190:上台阶 | OpenJudge NOI 2.3 3525:上台阶

    [题目链接] ybt 1190:上台阶 OpenJudge NOI 2.3 3525:上台阶 注:ybt 1190最大数据数量为71,而OpenJudge 2.3 3525中最大数据数量为100.如果 ...

  2. 信息学奥赛一本通 1225:金银岛 | OpenJudge NOI 4.6 1797:金银岛

    [题目链接] ybt 1225:金银岛 OpenJudge NOI 4.6 1797:金银岛 [题目考点] 1. 贪心 2. 部分背包问题 [解题思路] 该题为部分背包问题 1. 贪心选择性质的证明: ...

  3. 信息学奥赛一本通 1226:装箱问题 | OpenJudge NOI 4.6 19:装箱问题

    [题目链接] ybt 1226:装箱问题 OpenJudge NOI 4.6 19:装箱问题 [题目考点] 1. 贪心 [解题思路] 该题说是三维立方体,实际上无论是包裹还是产品,高度都是h,因而不用 ...

  4. 信息学奥赛一本通 1216:红与黑 / OpenJudge NOI 2.5 1818

    [题目链接] ybt 1216:红与黑 OpenJudge NOI 2.5 1818:红与黑 [题目考点] 1. 连通块问题 2. 深搜/广搜 [解题思路] 1. 深搜 从第一个格子出发,遍历所有可以 ...

  5. 信息学奥赛一本通 1115:直方图 | OpenJudge NOI 1.9 09

    [题目链接] ybt 1115:直方图 OpenJudge NOI 1.9 09:直方图 [题目考点] 1. 散列存储 也叫哈希存储.其思想为:将要存储的值通过某种算法映射到存储地址,映射算法为散列函 ...

  6. 信息学奥赛一本通 1114:白细胞计数 | OpenJudge NOI 1.9 08

    [题目链接] ybt 1114:白细胞计数 OpenJudge NOI 1.9 08:白细胞计数 [题目考点] 1. 求数组中最大值及其下标 方法1:保存最大值和下标 设置临时最大值变量mx,mx的初 ...

  7. 信息学奥赛一本通 1109:开关灯 | OpenJudge NOI 1.5 31:开关灯

    [题目链接] ybt 1109:开关灯 OpenJudge NOI 1.5 31:开关灯 [题目考点] 1. 模拟 2. 循环.数组 3. 用逗号分隔输出 设标志位:isFirst,表示现在输出的是否 ...

  8. 信息学奥赛一本通 1073:救援 | OpenJudge NOI 1.5 19:救援

    [题目链接] ybt 1073:救援 OpenJudge NOI 1.5 19:救援 [题目考点] 1. 直角坐标系下某点到原点的距离 点(x,y)(x,y)(x,y)到原点的距离d=x2+y2d = ...

  9. 信息学奥赛一本通 1070:人口增长 | OpenJudge NOI 1.5 14:人口增长问题

    [题目链接] ybt 1070:人口增长 OpenJudge NOI 1.5 14:人口增长问题 [题目考点] 1. 循环求幂 设变量r初始值为1:int r = 1; 循环n次每次循环中输入变量a, ...

  10. 信息学奥赛一本通 1060:均值 | OpenJudge NOI 1.5 03

    [题目链接] ybt 1060:均值 OpenJudge NOI 1.5 03:均值 [题目考点] 1. while循环 2. for循环 循环n次的两种写法 for(int i = 0; i < ...

最新文章

  1. ASP.NET Aries JSAPI 文档说明:AR.Form、AR.Combobox
  2. 浅谈Linux的内存管理机制
  3. mybaits二十二:一级缓存失效的几种情况
  4. timeSetEvent
  5. dos定义变量算术运算逻辑运算表达式分隔符
  6. android8.1自定义通知栏,Android 8.1隐藏状态栏图标的实例代码
  7. 面向对象的思想是什么?
  8. Android官方开发文档Training系列课程中文版:分享文件之配置文件共享
  9. 北京市(朝阳区)(西城区)(海定区)正则表达式(代码保存)
  10. android 放大镜动画,Android在图片上进行放大镜效果(放大镜形状)
  11. 全球AI人才只有2万多,仅3000人在求职 | 报告
  12. 网页设计常用字体(转)
  13. ARM裸机--看门狗定时器
  14. 登录英雄联盟lol后无法显示界面出不来问题解决
  15. 2023年中央民族大学新闻学保研必看上岸前辈复习经验分享
  16. SJ127 篮球积分器
  17. android9机型,安卓9正式定名Android 9 Pie,这些机型可以尝鲜
  18. 鼠标经过下划线 css3,详解css3和伪元素实现鼠标移入时下划线向两边展开
  19. vue 样式标签使用 scoped
  20. 关于element-ui的blur事件失效,select的blur的bug,以及row在@blur延迟的解决

热门文章

  1. 原创 | 不瞒你说,我也参加过培训
  2. 程序员内部培训与个人发展杂谈
  3. 美国电脑富农:Frank Soltis
  4. 2020年上半年我国互联网网络安全监测数据分析报告
  5. [C语言]if语句的常见用法
  6. 1.7-工控上位机软件开发平台介绍
  7. java设计斗地主游戏引言_斗地主游戏设计 毕业论文.doc
  8. TensorFlow入门操作
  9. 计算机单位 字节,字节是什么意思?字节是什么单位
  10. 三步生活法:土豆(Todo),优势,庆祝