信息学奥赛一本通 1293:买书 | OpenJudge NOI 2.6 6049:买书
【题目链接】
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:买书相关推荐
- 信息学奥赛一本通 1190:上台阶 | OpenJudge NOI 2.3 3525:上台阶
[题目链接] ybt 1190:上台阶 OpenJudge NOI 2.3 3525:上台阶 注:ybt 1190最大数据数量为71,而OpenJudge 2.3 3525中最大数据数量为100.如果 ...
- 信息学奥赛一本通 1225:金银岛 | OpenJudge NOI 4.6 1797:金银岛
[题目链接] ybt 1225:金银岛 OpenJudge NOI 4.6 1797:金银岛 [题目考点] 1. 贪心 2. 部分背包问题 [解题思路] 该题为部分背包问题 1. 贪心选择性质的证明: ...
- 信息学奥赛一本通 1226:装箱问题 | OpenJudge NOI 4.6 19:装箱问题
[题目链接] ybt 1226:装箱问题 OpenJudge NOI 4.6 19:装箱问题 [题目考点] 1. 贪心 [解题思路] 该题说是三维立方体,实际上无论是包裹还是产品,高度都是h,因而不用 ...
- 信息学奥赛一本通 1216:红与黑 / OpenJudge NOI 2.5 1818
[题目链接] ybt 1216:红与黑 OpenJudge NOI 2.5 1818:红与黑 [题目考点] 1. 连通块问题 2. 深搜/广搜 [解题思路] 1. 深搜 从第一个格子出发,遍历所有可以 ...
- 信息学奥赛一本通 1115:直方图 | OpenJudge NOI 1.9 09
[题目链接] ybt 1115:直方图 OpenJudge NOI 1.9 09:直方图 [题目考点] 1. 散列存储 也叫哈希存储.其思想为:将要存储的值通过某种算法映射到存储地址,映射算法为散列函 ...
- 信息学奥赛一本通 1114:白细胞计数 | OpenJudge NOI 1.9 08
[题目链接] ybt 1114:白细胞计数 OpenJudge NOI 1.9 08:白细胞计数 [题目考点] 1. 求数组中最大值及其下标 方法1:保存最大值和下标 设置临时最大值变量mx,mx的初 ...
- 信息学奥赛一本通 1109:开关灯 | OpenJudge NOI 1.5 31:开关灯
[题目链接] ybt 1109:开关灯 OpenJudge NOI 1.5 31:开关灯 [题目考点] 1. 模拟 2. 循环.数组 3. 用逗号分隔输出 设标志位:isFirst,表示现在输出的是否 ...
- 信息学奥赛一本通 1073:救援 | OpenJudge NOI 1.5 19:救援
[题目链接] ybt 1073:救援 OpenJudge NOI 1.5 19:救援 [题目考点] 1. 直角坐标系下某点到原点的距离 点(x,y)(x,y)(x,y)到原点的距离d=x2+y2d = ...
- 信息学奥赛一本通 1070:人口增长 | OpenJudge NOI 1.5 14:人口增长问题
[题目链接] ybt 1070:人口增长 OpenJudge NOI 1.5 14:人口增长问题 [题目考点] 1. 循环求幂 设变量r初始值为1:int r = 1; 循环n次每次循环中输入变量a, ...
- 信息学奥赛一本通 1060:均值 | OpenJudge NOI 1.5 03
[题目链接] ybt 1060:均值 OpenJudge NOI 1.5 03:均值 [题目考点] 1. while循环 2. for循环 循环n次的两种写法 for(int i = 0; i < ...
最新文章
- ASP.NET Aries JSAPI 文档说明:AR.Form、AR.Combobox
- 浅谈Linux的内存管理机制
- mybaits二十二:一级缓存失效的几种情况
- timeSetEvent
- dos定义变量算术运算逻辑运算表达式分隔符
- android8.1自定义通知栏,Android 8.1隐藏状态栏图标的实例代码
- 面向对象的思想是什么?
- Android官方开发文档Training系列课程中文版:分享文件之配置文件共享
- 北京市(朝阳区)(西城区)(海定区)正则表达式(代码保存)
- android 放大镜动画,Android在图片上进行放大镜效果(放大镜形状)
- 全球AI人才只有2万多,仅3000人在求职 | 报告
- 网页设计常用字体(转)
- ARM裸机--看门狗定时器
- 登录英雄联盟lol后无法显示界面出不来问题解决
- 2023年中央民族大学新闻学保研必看上岸前辈复习经验分享
- SJ127 篮球积分器
- android9机型,安卓9正式定名Android 9 Pie,这些机型可以尝鲜
- 鼠标经过下划线 css3,详解css3和伪元素实现鼠标移入时下划线向两边展开
- vue 样式标签使用 scoped
- 关于element-ui的blur事件失效,select的blur的bug,以及row在@blur延迟的解决