【POJ】poj 1787(多重背包)

动态规划,多重背包,保存路径,用完全背包的方法做多重背包(Charlie's Change,poj 1787) 就是用拆分物品的方法做的多重背包啦,时间复杂度为O(V∑logN[i]),空间复杂度为O(V)。由于是拆分物品,所以保存路径时不但要记录转移前的位置,还要记录当前硬币的类型以及使用的个数,输出前沿着路径找回去统计一下个数就好啦。一直WA不知所措,以为是算法问题一直找BUG,后来发现原来是一个quarters本来是25cents抄成了15cents。最后是自己带数据去测试才找到问题所在。写了这么多题 阅读详情

 

Description

Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffee at coffee vending machines at motorests. Charlie hates change. That is basically the setup of your next task. 

Your program will be given numbers and types of coins Charlie has and the coffee price. The coffee vending machines accept coins of values 1, 5, 10, and 25 cents. The program should output which coins Charlie has to use paying the coffee so that he uses as many coins as possible. Because Charlie really does not want any change back he wants to pay the price exactly. 

Input

Each line of the input contains five integer numbers separated by a single space describing one situation to solve. The first integer on the line P, 1 <= P <= 10 000, is the coffee price in cents. Next four integers, C1, C2, C3, C4, 0 <= Ci <= 10 000, are the numbers of cents, nickels (5 cents), dimes (10 cents), and quarters (25 cents) in Charlie's valet. The last line of the input contains five zeros and no output should be generated for it.

Output

For each situation, your program should output one line containing the string "Throw in T1 cents, T2 nickels, T3 dimes, and T4 quarters.", where T1, T2, T3, T4 are the numbers of coins of appropriate values Charlie should use to pay the coffee while using as many coins as possible. In the case Charlie does not possess enough change to pay the price of the coffee exactly, your program should output "Charlie cannot buy coffee.".

Sample Input

12 5 3 1 2
16 0 0 0 1
0 0 0 0 0

Sample Output

Throw in 2 cents, 2 nickels, 0 dimes, and 0 quarters.
Charlie cannot buy coffee.

 

多重背包问题,可以理解为01背包,但在转化过程中如果没有降低包的个数的话就会超时到哭。。。。所以采用二进制转化法。

 

 

<pre name="code" class="cpp">/**************************************************
采用系数化方法降低时间复杂度,首先将多重背包看成
01背包且n[i]个背包可以将其带上系数分解可以降低分解
的个数,最终降低时间复杂度。
***************************************************/
#include <iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
struct pay
{
    int num;
    int cent[4];
    pay()
    {
        cent[0] = 0; cent[1] = 0; cent[2] = 0; cent[3] = 0; num = 0;
    }
};
int mon(int i)
{
    switch (i)
    {
        case 0: return 1;
        case 1: return 5;
        case 2: return 10;
        case 3: return 25;
    }
}
int main()
{
    int money[4],pri;
    while ( cin >> pri >>money[0] >> money[1] >> money[2] >> money[3] )
    {
        if ( pri == 0 ) break;
        pay ways[10005];
        int vis[10005] = {0};
        vis[0] = 1;
        for ( int i = 0; i < 4; i++ )
        {
            int l = 1;
            while ( money[i] - l > 0)
            {
                for ( int k = pri - l * mon(i); k >= 0; k-- )
                {
                    if ( vis[k] )
                    {
                        if ( ways[k + l * mon(i)].num >= ways[k].num + l );
                        else
                        {
                            ways[k + l * mon(i)].num = ways[k].num + l;
                            ways[k + l * mon(i)].cent[0] = ways[k].cent[0];
                            ways[k + l * mon(i)].cent[1] = ways[k].cent[1];
                            ways[k + l * mon(i)].cent[2] = ways[k].cent[2];
                            ways[k + l * mon(i)].cent[3] = ways[k].cent[3];
                            ways[k + l * mon(i)].cent[i] += l;
                        }
                        vis[ k + l*mon( i )] = 1;
                    }
                }
                money[i] -= l;
                l *= 2;///采用二进制方法降低时间复杂度,
                    ///在化为01背包的同时减少背包的个数,并且保证每个数字都可以取上
            }
            l = money[i];
            for ( int k = pri - l * mon(i); k >= 0; k-- )
            {
                if ( vis[k] )
                {
                    if ( ways[k + l * mon(i)].num >= ways[k].num + l );
                    else
                    {
                        ways[k + l * mon(i)].num = ways[k].num + l;
                        ways[k + l * mon(i)].cent[0] = ways[k].cent[0];
                        ways[k + l * mon(i)].cent[1] = ways[k].cent[1];
                        ways[k + l * mon(i)].cent[2] = ways[k].cent[2];
                        ways[k + l * mon(i)].cent[3] = ways[k].cent[3];
                        ways[k + l * mon(i)].cent[i] += l;
                    }
                    vis[ k + l*mon( i )] = 1;
                }
            }
        }
        if ( vis[pri] )///如果访问过的话就说明可以支付
            printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",
                   ways[pri].cent[0],ways[pri].cent[1],ways[pri].cent[2],ways[pri].cent[3]);
        else
            printf("Charlie cannot buy coffee.\n");
    }
}

 

 


 

 

 

 

 

 

 

 

基于Openrouter的API调用免费大模型 Openrouter 是一个 AI 模型聚合平台,整合了全球 200 多种主流 AI 模型,包括 GPT-4、Claude、Gemini 等,以及国产通义千问、DeepSeek 等。其核心优势是统一的 API 设计,开发者仅需少量代码即可与多个模型交互,还支持自动路由与回退机制。用户可通过 OpenAI SDK 或 LangChain 调用 Openrouter 中的模型。 阅读详情

相关推荐

LabVIEW电压信号采集系统:从零搭建到科研实战

本文详细介绍了如何从零开始搭建一个基于LabVIEW的电压信号采集系统。内容涵盖硬件选型(如NI USB-6002数据采集卡)、软件环境配置、核心程序开发(包括多通道同步采集、数据自动保存)以及高级功能优化。系统支持自定义采样率与时长,并提供了完整的LabVIEW程序框图和配套的Python数据分析脚本,旨在帮助科研人员和工程师快速构建稳定、高效的专属数据采集方案,提升实验自动化水平。

gold8的专栏 461

poj1742(多重背包)

链接:点击打开链接 题意:给出n种钱的数量和面额,问用这些钱能拼成1~m中的值的数量 代码1:#include #include #include #include using namespace std; int dp[100005],w[105],v[105]; int n,m; int main(){ int i,j,ans; while(scanf("%d%d"

stay_accept的专栏 741

数据结构与算法 —— 最短路径Dijkstra算法(迪杰斯特拉)详细图解以及python实现

前两章我们讲到了关于图的基本知识,和广度/深度优先搜索。本章,我们将介绍加权图和最短路径的相关知识。最短路径和最小生成树是图论中常见的问题。最短路径是指在一个图中找到两个节点之间的最短路径,最小生成树是指在一个图中找到一个连通子图,使得所有节点都能够互相到达,且总权值最小。最短路径算法常见的有floyd算法(弗洛伊德算法)和 dijkstra算法(迪杰斯特拉)。本文只介绍dijkstra算法。最短路径运用非常广泛,比如在导航系统中,确定两个地点间哪条路线最短;

‘’ 2万+

POJ Space Elevator(排序+多重背包)

题目分析 好久没有写背包了,因此找了一个多重背包练一下,因为多重背包是01背包和完全背包的结合,手生,写了有一会!!! 就是给你一下砖块,每一个砖块一个高度,给出数量和这样砖块最多能放的高度。。 这道题因为每个点的限制不一样,所以需要从限制小的先进行dp,因为限制大的可以放在限制小的上面,但是限制小的无法再往大的上面堆,这样就算错了。。 #include <cstdio> #incl

你真的介意真的在乎真的想要真的渴望的话你一定能够做到 658

[华为]华为无线控制器AC6508简单配置实例

用户需求:3个地址段,分别是领导、员工、访客,访问控制策略是只允许访客上网,不允许访客访问内网。 vlan173为设备的管理地址和AP获取的地址,领导、员工、访客的vlan分别是vlan131/vlan132/vlan133 首先是许可的下载,使用华为的账号登陆http://app.huawei.com/isdp ,然后按照说明输入许可,下载许可,将许可导入到设备。 web界面访问后,直接按照配置向导配置就可以了。 1.基本配置里主要配置license、设备名称、设备时间 2.端口配置:连接上

日子_很简单 2万+

开篇词:学习系统分析师的好处?核心考点有哪些?

系统分析师备考指南 系统分析师是IT行业的高级专业人才,具备系统分析与设计能力,能指导开发团队工作。学习系统分析师不仅能获得职业晋升的"黄金跳板",还能全面提升技术架构思维和业务理解能力。 核心价值: 职业发展:晋升管理岗位的硬性要求,突破职业天花板 能力提升:构建T型知识结构,培养架构思维和软技能 市场竞争力:成为"业务+技术"桥梁,获得国家级专业认证 考试内容: 计算机基础知识(硬件、操作系统、网络等) 系统分析专业知识(软件工程、架构设计等) 进阶知识(企业信息

数据知道的博客 5940

poj1787(记录路径+多重背包)(可以用完全背包来模拟)

地址:http://poj.org/problem?id=1787 Charlie's Change Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2689   Accepted: 721 Description Charlie is a drive

ten_three 1272

Vins-Fusion 外参camera-imu 标定

Vins-Fusion是一种基于优化的多传感器状态估计器,一大特色是支持实时camera-imu外参校准(相机和IMU之间的旋转)。Vins-Fusion 外参camera-imu校准是利用两帧间计算相机位姿和imu预积分得到位姿,构建最小二乘问题,并通过SVD求解camera-imu外参旋转矩阵。

u010196944的博客 2490

POJ1787多重背包中在最优方案下输出具体的选择方案

https://www.cnblogs.com/ziyi--caolu/p/3211147.htmlhttps://blog.youkuaiyun.com/libin56842/article/details/9470687https://blog.youkuaiyun.com/softtrilobite/article/details/23132809https://blog.youkuaiyun.com/hmc0411/arti...

sxy201658506207的博客 662

RT-DETR训练自己的数据集(从代码下载到实例测试)

在Windows10上配置CUDA环境教程是百度提出的一种实时目标检测模型。RT-DETR采用了与DETR相同的编码器和解码器结构,但对其进行了大量的优化,在保持较高检测精度的同时,实现了实时目标检测,为目标检测领域提供了一种新的有效解决方案,具有广泛的应用前景,如自动驾驶、智能监控、机器人等领域。以上是RT-DETR官方的论文和代码,详细介绍了RT-DETR的构成和实现。在YOLOv10中也实现了RT-DETR的代码,所以本文使用YOLOv10的项目文件进行RT-DETR的训练和测试。YOLOv10。

Limiiiing的博客 4万+

构建AI招聘助手:提高人才筛选与匹配效率

人工成本高:传统招聘过程涉及大量的简历筛选和面试安排,需要耗费大量的人力和时间。匹配效率低:简历筛选过程中,人为因素可能导致信息遗漏或误判,影响匹配效果。招聘周期长:从职位发布到最终录用,传统招聘流程往往耗时较长,影响企业业务发展。机器学习(Machine Learning)是一门让计算机通过数据和经验来学习并改进性能的学科。自然语言处理(Natural Language Processing,NLP)是计算机科学领域与人工智能领域中的一个重要方向,旨在让计算机能够理解和解释人类语言。

AI天才研究院 1304

poj 1787 多重背包+路径记录

4种钱币,价值是1 5 10 25,给你他们的个数,问能不能用最多的钱币到达p,如果能输出每种的个数,不能输出不能。。 开个numb二维数组记录路径。 #include #include #include using namespace std; int numb[11000][4],dp[20000],ci[4],p,wi[4]; void complete(int cost,int i

孩子 要努力啊 1010

【小白深度教程 1.3】使用 BP-Net 深度补全网络,进行 KITTI 稠密点云和图像融合(Depth Completion 实战)

在上一节中,我们展示了如何将从激光雷达获取的稀疏点云(深度)映射到图像。因此这篇论文我们尝试使用 Depth Completion(深度补全)技术,来将稀释的点云深度,补全为稠密深度。

2401_87064292的博客 1199

Charlie's Change POJ - 1787 (多重背包记录路径)

题目 https://cn.vjudge.net/problem/POJ-1787 题意 裸地多重背包但要记录路径 思路 正常多重背包加个记录路径数组即可 #include <algorithm> #include <iostream> #include<cstdio> #include <cstdlib> #include &l...

七九河开的博客 304

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

poj1787 Charlie's Change(多重背包+路径)

http://poj.org/problem?id=1787 题意:查理想买咖啡,咖啡销售机只支持三种硬币,分别是1分、5分、10分、15分。然后给出查理拥有的四种硬币的个数,求查理最多可以消耗多少硬币,可以正好买到咖啡而且不需要找钱。 思路:给出每种物品的个数,即为多重背包。不过这题要求的是装满情况下的最多数量,那么数量即为价值。最后要求把每种硬币的数量分别输出,难点就在路径的记

Iguodala的博客 625

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

poj 1787 多重背包 记录路径

#include #include #include #define N 10100 using namespace std; int dp[N]; int used[N]; int path[N]; int num[30]; int main(){ int b[10]; int P,c1,c2,c3,c4; int a[10]; while(scanf("%d",&P)!

#include<?> 638

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...

poj1787-多重背包(基于完全背包)

这题一拿到看明显用背包来做

成为大soft虫的梦想屋 1237

POJ 1787 Change 多重|完全背包

Charlie's Change Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3895   Accepted: 1183 Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charl

Houheshuai的专栏 573

POJ - 1787 (多重背包还原路径|| 完全背包)

POJ 1787 Charlie's Change Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffee at coffee vending machines at motores...

aitang6631的博客 271

poj 1787 Charlie's Change(多重背包路径记录)

题目:点击打开链接题意:给出了一杯咖啡多少钱,和1块,5块,10块,25块各有多少,要正好买这杯咖啡,并且花的硬币越多越好。思路:简单的多重背包,类似poj2392,不用二进制优化,恰好买这杯咖啡,初始化为负无穷。第二个条件更简单,从小面值的开始放就行。记录路径又不会了,用path数组记录他的前一个值,每次用时用n-path[n]得到的差值就是放入的面值。但。。。。这些都不要紧,为什么dp[j]要...

智浩的博客 287

poj 1787 多重背包记录路径

第一道记录路径的题目 Charlie's Change Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1998   Accepted: 476 Description Charlie is a driver of Advanced Cargo Movement, L

努力奋斗才能梦想成真 1115

Poj 1787 Charlie's Change(多重背包 或者 记录的完全背包)

这题首先A出的思路是多重背包,因为个数不是无限,很容易就联想到是多重背包了, 其实一开始打算用完全背包写的,因为之前做过的即到关于硬币的题目都是用完全背包写的, 这题是因为要记录个数所以就每想下去了,看了别人AC的时间,然后搜了下题解才发现可以用完全背包 题目大意:用有限个1,5,10,25这些硬币构成一个数n,要求使用硬币数最多,问每种硬币使用的个数. 思路: 多重背包:用二进制的思想

Bison_的博客 507

POJ_1787_多重背包方案记录

Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffee at coffee vending machines at motorests. Charlie hates change. That is basically

nwpuxhld 1068

POJ 1787 Charlie's Change 记录路径的多重背包

Charlie's Change Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3499   Accepted: 1032 Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charl

xiaohuihui 650

poj 1787 记录路径的多重背包

如题:http://poj.org/problem?id=1787   Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffee at coffee vending machines at motorests. Charli

zht的专栏 577

poj 1787 Charlie's Change(完全背包 或 多重背包 记录路径)

多重背包,但是可以用完全背包来做。 参考:http://www.cnblogs.com/kuangbin/archive/2012/09/20/2695803.html#include <stdio.h> #include <string.h> #include <algorithm> using namespace std;const int INF = 0x3f3f3f3f; const in

梦幻的蔷薇色 508
上一篇: 【HDU】hdu 1114 (完全背包)
下一篇: c++ 头文件
三生石1103
博客等级 码龄12年 16粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值