upc-Optimal Coin Change(完全背包+路径回溯记录)

完全背包算法1猴子摘桃及回溯 1:完全背包问题 说明:代码包含完全背包问题的 计算方法和回溯代码。针对的问题如下: 猴子代行镇山之令后愈发聪明能干,经常寻找水果与其小伙伴们分享。一日,猴子又到果林中摘果子,果林中有香蕉、桃子、葡萄、苹果还有西瓜等,一番尽情享受之后,这次它开动脑筋,决定用身上的背袋尽量多带走价值高的一些水果与其小伙伴们分享。假设香蕉、桃子、西瓜、苹果以及葡萄5种水果的重量分别为w1,w2,w3,w4,w5(忽略单位,后同),其对应的价值分别为v1,v2,v3,v4,v5(忽略单位)。猴子A随身所带背包的最大载重量为m。 阅读详情
题目描述

In a 10-dollar shop, everything is worthy 10 dollars or less. In order to serve customers more effectively at the cashier, change needs to be provided in the minimum number of coins.
In this problem, you are going to provide a given value of the change in different coins. Write a program to calculate the number of coins needed for each type of coin.
The input includes a value v, a size of the coinage set n, and a face value of each coin, f1, f2, …, fn. The output is a list of numbers, namely, c1, …, cn, indicating the number of coins needed for each type of coin. There may be many ways for the change. The value v is an integer satisfying 0 < v ≤ 2000, representing the change required
in cents. The face value of a coin is less than or equal to 10000. The output of your program should take the combination with the least number of coins needed.
For example, the Hong Kong coinage issued by the Hong Kong Monetary Authority consists of 10 cents, 20 cents, 50 cents, 1 dollar, 2 dollars, 5 dollars and 10 dollars would be represented in the input by n = 7, f1 = 10, f2 = 20, f3 = 50, f4 = 100, f5 = 200, f6 = 500, f7 = 1000.

输入

The test data may contain many test cases, please process it to the end of the file.
Each test case contains integers v, n, f1, …, fn in a line. It is guaranteed that n ≤ 10 and 0 < f1 < f2 < …< fn.

输出

The output be n numbers in a line, separated by space. If there is no possible change, your output should be a single −1. If there are more than one possible solutions, your program should output the one that uses more coins of a lower face value.

样例输入
2000 7 10 20 50 100 200 500 1000
250 4 10 20 125 150
35 4 10 20 125 150
48 4 1 8 16 20
40 4 1 10 13 37
43 5 1 2 21 40 80
样例输出
0 0 0 0 0 0 2
0 0 2 0
-1
0 1 0 2
3 0 0 1
1 1 0 1 0
题意

给你 v 块钱,有 n 种面值的硬币,第 i 个硬币的面额为 f [ i ] (硬币数量不限),问你能否正好凑出 v 块钱,不能的话输出 - 1 ,能的话输出使用硬币数最少的方案。

思路

完全背包( 这里转移方程是: f [ j ] = min ( f [ j ] , f [ j - a [ i ] ] + 1 ) ( j 是 j 块钱, i 是第 i 种硬币 ,这里取最小的,因为尽量要硬币数最少,同时 f [ j ] 数组记得初始化)),还有就是路径的回溯与记录,详情请看代码吧。。。。

代码
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define best 131 
#define INF 0x3f3f3f3f
#define P pair<int,int>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double eps=1e-7;
const double pai=acos(-1.0);
const int N=2e4+10;
const int maxn=4e5+10;
const int mod=1e9+7;
//const int d[4][2]={0,1,1,0,-1,0,0,-1};
int f[2010],a[10010],ans[10010],v,n;
void init()
{
    for(int i=1;i<=2010;i++) f[i]=INF;
    for(int i=1;i<=n;i++) ans[i]=0;
}
int main()
{
//  ios::sync_with_stdio(false);
    //memset(mp,-1,sizeof(mp));
    while(scanf("%d",&v)!=EOF)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        init();f[0]=0;
        for(int i=1;i<=n;i++)
            for(int j=a[i];j<=v;j++) 
                f[j]=min(f[j],f[j-a[i]]+1);
        if(f[v]==INF) printf("-1\n");
        else
        {
            int tmp=v;
            while(tmp)
            {
                for(int i=n;i>=1;i--)
                {
                    if(tmp>=a[i]&&f[tmp]==f[tmp-a[i]]+1)
                    {
                        ans[i]++;
                        tmp=tmp-a[i];
                        break;
                    } 
                }
            }
            for(int i=1;i<n;i++) printf("%d ",ans[i]);
            printf("%d\n",ans[n]);
        }
    }
    return 0;
}
poj1787 完全背包+路径记录总结 第一次接触完全背包,看了别人思路后再写的。 关于本题的背包问题的几个总结: 1. 注意分析全面转移条件,有时候这个问题会卡住 2. 这题的背包是每个物品有限个,本题中用cnt[]在转移条件中限制 3. 学会将问题转化,例如本题一开始想不到用背包,考虑用搜索如果真的搜索的话效率一定低下,但要求是硬币数最多的组合,就能用背包了 4. 通过Pre[]记录路径的方法很有意思   代码: ... 阅读详情

相关推荐

01背包,部分背包,完全背包问题.docx

C++实现。对0/1背包问题应用3种方法(动态规划、回溯法、分支限界法)求解,通过一个规模较大的实例比较三种方法的求解速度。 对背包问题和完全背包问题应用动态规划和贪婪算法,通过实例比较求解速度。 随机生成500个0/1背包问题(问题规模可以相对较小),使用贪心算法和动态规划进行求解。

01背包输出路径、完全背包、多重背包

背包问题01 Knapsack(输出路径- >选的物品)完全背包恰好占用了m这么多的背包容量???多重背包问题Ⅰ多重背包问题Ⅱ 01 Knapsack(输出路径- >选的物品) #include <iostream> #include <stack> #include <string.h> using namespace std; const int N=105; int w[N]; int v[N]; int path[N][1005];//path[i][

qq_51070956的博客 2815

Ta-Lib源码解析(三):蜡烛图指标 (Candlestick Indicator) #(附Python重构代码和示意图)(补充中)

蜡烛图指标为识别K线形态的指标,笔者认为重点在于定义方式所提供的思路,背后的投资逻辑可以借鉴但不建议直接参考文档的翻译内容和源码逻辑存在不一致的现象,笔者分别列出中文百科中的定义和源码实际逻辑,供大家参考技术分析理论中的一些模糊词,ta-lib中给出了精确的定义源码

量化就是探索生活 3254

回溯算法+分支限定解决01背包、完全背包

(一)回溯算法+分支限定解决01背包 //动态规划的背包问题可以看我的之前博客       #include &lt;iostream&gt;     #include &lt;cstdio&gt;     #include &lt;algorithm&gt;     using namespace std; #define MAXN 10     struct Goods_Info ...

杨氏计算机知识整理 2061

从ADC校准到精准测量:避开PY32F030小信号采样的那些坑

本文深入探讨了PY32F030微控制器进行ADC小信号采样时面临的挑战与解决方案。从硬件设计、软件滤波算法到系统级校准策略,详细分析了如何避开常见陷阱,实现精准测量,特别是在25mV以下小信号场景中的应用实践。

ujm567890的博客 757

基于STM32与MPU6050的实时姿态检测系统设计与实现(源码+硬件解析)

本文详细介绍了基于STM32单片机与MPU6050传感器的实时姿态检测系统设计与实现。通过硬件解析、传感器校准、卡尔曼滤波算法和欧拉角计算,实现高精度姿态检测。提供完整源码和调试技巧,适用于无人机、平衡车等嵌入式开发项目,解决噪声干扰和数据漂移等常见问题。

jupi8的博客 493

dp 完全背包问题python

我们今天来学习完全背包问题,完全背包问题是基于0-1背包的基础,如果不明白或者忘记了可以点击下面的链接。 https://blog.youkuaiyun.com/qq_53500156/article/details/123454958?spm=1001.2014.3001.5501 为什么呢,0-1背包问题,它是按照前一行来进行计算,而完全背包问题就可以在该行进行判断与计算。好好理解 c = 10 #背包容量 w = [3,4,5,7] #物体体积 v = [1,5,6,9.

cindera的刷题记录 1931

用AI从0开始量化交易-制定学习计划安装学习环境

量化小白,利用AI从零开始学量化

weixin_52285994的博客 2112

回溯算法--01背包问题

回溯算法是一种解决问题的通用算法,能够在一个问题的所有解空间中,按深度优先的策略搜索,直到找到所需要的解或者搜索完整个解空间都没有找到解。0-1背包问题是指在限制背包容量的情况下,在一堆物品中选择一部分,使得这些物品的总价值最大。C++ 设计回溯算法解决0-1 背包问题的思路。

m0_63064861的博客 1万+

SAP Single Sign-On 全景指南:从传统 SAP SSO 到 SAP Secure Login Service for SAP GUI 的架构、场景与迁移实践

本文系统梳理了SAP生态下的单点登录技术方案,重点分析了SAP GUI的云化替代方案SAP Secure Login Service(SLS)。内容涵盖SNC、Kerberos/SPNEGO、SAML 2.0等核心协议的技术实现,对比了传统SAP SSO与新型SLS for SAP GUI的架构差异,并给出AS ABAP系统的具体实施路径。针对SAP GUI访问、浏览器访问Fiori/移动端等不同场景,提供了详细的协议选型建议和配置指南,帮助团队构建安全可靠且适应云时代的统一认证体系。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 273

AI学习指南RAG篇(19)-API调用与集成

通过上述API调用示例,您可以方便地将RAGFlow与其他系统集成,实现数据集管理、文档处理、会话管理等功能。希望本文的介绍能帮助您更好地理解和使用RAGFlow的API。

俞兆鹏的博客 2545

UPC-5561 Optimal Coin Change(DP)

题目描述 In a 10-dollar shop, everything is worthy 10 dollars or less. In order to serve customers more effectively at the cashier, change needs to be provided in the minimum number of coins. In this pr...

kuronekonano的博客 259

windows 配置 libxml2

路径:\libiconv-1.9.2-1-src.zip\src\libiconv\1.9.2\libiconv-1.9.2\include\。执行完后,在当前win32目录中会生成了一个bin.msvc目录,其中就有开发需要的libxml2.lib和libxml2.dll文件。将 libiconv.la 复制到 新建的 lib 目录,并将其改名为 iconv.lib。路径:libiconv-1.9.2-1-bin.zip\lib\。将如下的 iconv.h 复制到新建的 include 目录。

SHELLCODE_8BIT的博客 3886

完全背包的问题及路径问题

动态规划完全背包

qq_45859272的博客 339

使用Matlab实现海洋监视雷达检测仿真

海洋监视雷达是一项重要的海洋探测技术,可以用于海上船只、飞机、潜艇等目标的探测和监视,具有广泛的应用价值。本篇文章将介绍如何使用Matlab进行海洋监视雷达的检测仿真,并提供相应的源代码。本篇文章提供了利用Matlab进行海洋监视雷达检测仿真的基本思路和代码实现。读者可以根据自己的需求进行修改和优化,以适应不同的应用场景。使用Matlab实现海洋监视雷达检测仿真。

2301_78484069的博客 448

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【SOJ】超大背包 (回溯法经典应用)

超大背包 前提:01背包问题是NP难问题,解空间可以用子集树表示。 注意点: 1.剪枝条件。一是如果装入后重量超出背包重量就剪枝。二是如果不装入,剩余背包体积可装入价值的上界加上当前价值cv也达不到当前最优价值bestv也剪枝。 2.要求剩余背包可装入体积的上界,需要排序,然后依次装入物品,直到装不下的时候装入一部分。因此可以一开始就对所有物品按照价值重量比进行排序,这样之后的上...

coderwait 717

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

完全背包+记录路径

给定面值v,n种硬币,硬币面值为f1..fn 求凑成v所需要的硬币数,且优先使用小面值的硬币。 #include #include #include using namespace std; const int maxn = 12; const int maxv = 2000 + 5; const int INF = 0x3f3f3f

unintended 1520

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python 完全背包问题_Python基于回溯法解决01背包问题实例

本文实例讲述了Python基于回溯法解决01背包问题。分享给大家供大家参考,具体如下:同样的01背包问题,前面采用动态规划的方法,现在用回溯法解决。回溯法采用深度优先策略搜索问题的解,不多说,代码如下:bestV=0curW=0curV=0bestx=Nonedef backtrack(i):global bestV,curW,curV,x,bestxif i>=n:if bestV...

weixin_39640849的博客 497

关于完全背包的一点理解

基本思路中 的状态转移方程可以等价地变形成这种形式:f[i][v]=max{f[i-1][v],f[i][v-w[i]]+c[i]} 在考虑“加选一件第i 种物品”这种策略时,却正需要一个可能已选入第i种物品的 子结果f[i][v-w[i]],所以就可以并且必须采用v= 0..V的顺序循环 将这个方程用一维数组实现,便得到了下面的代码。    for(v=w[i];v&lt;=m;v++) ...

冲冲冲 304

背包问题——“完全背包”详解及实现(包含背包具体物品的求解)

-----Edit by ZhuSenlin HDU         完全背包是在N种物品中选取若干件(同一种物品可多次选取)放在空间为V的背包里,每种物品的体积为C1,C2,…,Cn,与之相对应的价值为W1,W2,…,Wn.求解怎么装物品可使背包里物品总价值最大。 动态规划(DP):         1) 子问题定义:F[i][j]表示前i种物品中选取若干件物品放入剩余空间为j的背包中所能

wumuzi520的专栏 6万+

【动态规划】三种背包问题(01背包、完全背包、多重背包)

一、01背包 问题描述:给定n个物体(它们的重量为:w1,w2,......,wn,价值为:v1,v2,......,vn) 和 一个承受重量为W的背包,问怎么选取这些物体,放在背包中(不超过背包的承重),让所取的子集达到最大价值。 1、基本实现 首先,我们很自然想到穷举法,只要给出n个物体的所有组合(子集),分别各个子集的总价值,去掉那些总重量超过背包承重W的子集之后,对剩下的子集中找到总...

小景的博客 2万+

总结——01背包问题 (动态规划算法)

0-1 背包问题:给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 wi,其价值为 vi 。 问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?

并非所有流浪者都迷失了自我 21万+

322. 零钱兑换(Coin Change)

322. 零钱兑换(Coin Change)题解记忆化回溯(自顶向下)复杂度分析PythonJava(待完成)动态规划(自下而上)复杂度分析PythonJava(待完成) 题解 记忆化回溯(自顶向下) 如上图,在回溯过程中,将中间结果保存下来,这样可将复杂度降低到O(n)O(n)O(n)。 初始化记忆词典memo={0:0}memo=\{0:0\}memo={0:0},表示0元的组成种类为0...

朱师傅的博客 429

dp专题-DGA上的dp:硬币问题-完全背包:回溯路径+记录路径

题目:硬币问题。有n种硬币,面值分别为V1, V2, …, Vn,每种都有无限多。给定非负整数S, 可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值。 1≤n≤100,0≤S≤10000,1≤Vi≤S。 分析:这个模型和上一题类似,但也有一些明显的不同之处:上题并没有确定路径的起点和终点(可以把任意矩形放在第一个和最后一个),而本题的起点必须为S,终点必须为0;点固 定之后“...

H_ang的博客 578

【DP | 记忆化搜索】【ICPC 2017 HongKong 】Optimal Coin Change

题目描述 In a 10-dollar shop, everything is worthy 10 dollars or less. In order to serve customers more effectively at the cashier, change needs to be provided in the minimum number of coins. In this pro...

Z_sea的博客 359
上一篇: upc-WNJXYK and DIDIDI and monkey(并查集启发式合并)
下一篇: 牛客-Arithmetic Progressions(dp优化)
Cosmic_Tree
博客等级 码龄7年 134粉丝 337原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值