Description

卖方:这件商品14元 买方:给你20元 卖方:不好意思,我的零钱不够 买方:好吧,这是15元,剩的当小费

当到一个地方旅游时,如果你买东西的地方不支持信用,带零钱还是非常有用的。特别是有时候卖方没有零钱,如果你没有刚好的钱,你需要支付比卖价多一点。

当然你想付尽量少的钱(至少是商品价值的钱)。并且,当支付最少钱的时候,也最好是支付的硬币的数量最少。

Input

第一行包含一个整数表示测试数据的组数。每组测试数据每一行包含一个整数,表示你需要付的钱数,钱数不超过10000元。接下来包含一个整数n,表示你所拥有的钱的数量,n最多是100,接下来的n行每行一个整数,表示你有的每个硬币的面值,注意钱的面值可以是任意的,不和我们现在用的面值一样,钱的面值不超过10000元。

Output

对每组测试数据,在一行上输出两个整数:需要支付的钱数和数量。

Sample Input

1
1400
3
500
1000
2000

Sample Output

1500 2

动态规划问题,当成0-1背包处理,也可以当成多重背包。

这里当成0-1背包处理即可,物品最多就100种,每种取或不取

dp[j]是价值j需要dp[j]张钱

dp[j]先初始化正无穷,表示价值j的没有钱可以凑出j

dp[0] = 0,表示0元需要0张钱。

递推公式:

$$ dp[j]\ = \ \begin{cases} min(dp[j\ -\ num[i]]\ +\ 1,\ dp[j]) &\ i = 1 -> n,\ j = 20000 -> num[i] \end{cases} $$

也可以用二维数组,只不过开辟的空间大

dp[i][j]表示前i张面值可以组成价值j的最少张数

dp[i][j]全部初始化正无穷,dp[0][0] = 0

递推公式:

$$ dp[i][j]\ = \ \begin{cases} min(dp[i\ -\ 1][j\ -\ num[i]]\ +\ 1,\ dp[i\ -\ 1][j]) &\ j >= num[i] \\ dp[i\ -\ 1][j] &\ 0 <= j < num[i] \\ \end{cases} $$

最后找dp[j],从j = 输入的价钱,开始找满足条件且价钱最小的

AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std; int dp[20001]; int main()
{
ios::sync_with_stdio(false); // 避免cout, cin导致TLE
int n;
cin >> n; // n组测试数据
while (n--)
{
memset(dp, 0x7f, sizeof(dp)); // dp全部置正无穷
dp[0] = 0; // 第一个元素置零
int price, money_nums; // price是价钱, money_nums是钱的张数
cin >> price >> money_nums;
int money[100]; // 钱面值数组
for (int i = 0; i < money_nums; i++)
cin >> money[i];
for (int i = 0; i < money_nums; i++)
for (int j = 20000; j >= money[i]; j--) // 逆序进行
dp[j] = min(dp[j], dp[j - money[i]] + 1); // 递推公式
for (int i = price; i <= 20000; i++)
{
if (dp[i] <= 100) // 找到第一个满足钱数最小的, 并且张数小于100, dp[i]已经是最优的
{
cout << i << ' ' << dp[i] << endl; // 输出结果
break;
}
}
}
return 0;
}

一开始数组开10000,提交通过了

后来发现,有些测试数据应该通过不了

比如:

1
10000
2
9999
9999
19998 2

之前的代码会什么都不输出,

把数组开成20000就行了。

之前没考虑这种特殊情况,碰巧通过了

背包问题(动态规划 C/C++)的更多相关文章

  1. c语言数据结构:01背包问题-------动态规划

    两天的时间都在学习动态规划:小作业(01背包问题:) 数据结构老师布置的这个小作业还真是让人伤头脑,自己实在想不出来了便去网上寻找讲解,看到一篇不错的文章: http://www.cnblogs.co ...

  2. PAT1048. Find Coins(01背包问题动态规划解法)

    问题描述: Eva loves to collect coins from all over the universe, including some other planets like Mars. ...

  3. 0-1背包问题——动态规划求解【Python】

    动态规划求解0-1背包问题: 问题:背包大小 w,物品个数 n,每个物品的重量与价值分别对应 w[i] 与 v[i],求放入背包中物品的总价值最大. 动态规划核心:计算并存储小问题的最优解,并将这些最 ...

  4. 【C/C++】01背包问题/动态规划

    按小蓝书上写的大数据情况下没过,按解答区一个大佬的修改了过了 #include <bits/stdc++.h> using namespace std; class Solution { ...

  5. Java-01背包问题-动态规划-递归和非递归实现

    国际惯例,先上代码,粗略分析: package com.bag; /** * Author: lihao * Date:2017/8/31 * Description: */ public class ...

  6. 【动态规划】【C/C++】简单的背包问题

    简单的背包问题 背包问题动态规划中非常经典的一个问题,本文只包含01背包,完全背包和多重背包.更加详尽的背包问题的讲解请参考崔添翼大神的<背包九讲> 简单的01背包 问题导入:新年到了,m ...

  7. ACM1881 01背包问题应用

    01背包问题动态规划应用 acm1881毕业bg 将必须离开的时间限制看作背包容量,先将他们由小到大排序,然后在排完序的数组中对每个实例都从它的时间限制开始(背包容量)到它的延长时间进行遍历: #in ...

  8. python实现算法: 多边形游戏 数塔问题 0-1背包问题 快速排序

    去年的算法课挂了,本学期要重考,最近要在这方面下点功夫啦! 1.多边形游戏-动态规划 问题描述: 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值, 每条边被 ...

  9. 第四章:动态规划I

    4.1背包问题 动态规划的核心:如何构造一个高效的备忘录,提高整个问题求解的效率. 4.2最大子数组问题II

随机推荐

  1. docket镜像

    1.是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. 1.1.什么是UnionF ...

  2. sentinel控制台的使用

    一,下载sentinel控制台:sentinel-dashboard-1.7.0.jar , 注 1.7.1版本控制台与最新的sentinel有冲突,会报invalid type错误 二,启动sent ...

  3. Luban图片压缩

    导入依赖: implementation 'top.zibin:Luban:1.1.3' public class MainActivity extends AppCompatActivity { p ...

  4. 常用的Css函数

    1. attr() 用来选择元素的属性值,用法:attr(html元素的属性名),正常搭配css content一起使用 html: <p><a href="http:// ...

  5. 论文解读《Understanding the Effective Receptive Field in Deep Convolutional Neural Networks》

    感知野的概念尤为重要,对于理解和诊断CNN网络是否工作,其中一个神经元的感知野之外的图像并不会对神经元的值产生影响,所以去确保这个神经元覆盖的所有相关的图像区域是十分重要的:需要对输出图像的单个像素进 ...

  6. Mongodb命令 --- MongoDB基础用法(二)

    Mongodb命令 数据库操作 创建数据库 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 删除数据库 Mong ...

  7. 群晖DS218+部署mysql

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. debian 安裝SSH 增加新用戶 并使用sudo

    1 新建新用戶user 2 3 adduser user 4 5 passwd 123654 6 7 exit 刚安装好的Debian默认还没有sudo功能. 1.安装sudo # apt-get i ...

  9. 【USACO】Strolling Cows

    Strolling Cows 给定有 \(n\) 个点 \(n\) 条边的有向图,每个点的出度都为 \(1\),求图中的最大环. 显然入度为 \(0\) 的点不可能为最大环上的点,所以考虑删点. 然后 ...

  10. ASP.NET Core框架揭秘[博文汇总-持续更新]

    第1部分 跨平台开发体验 1 跨平台开发体验 001 跨平台开发体验: Windows [上篇]         002 跨平台开发体验: Windows [中篇]        003 跨平台开发体 ...