【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");
    }
}

 

 


 

 

 

 

 

 

 

 

PyTorch ModelNet点云数据集加载实战:从下载到Dataset类完整实现 在三维视觉与点云处理领域,数据集是算法研发的基石。ModelNet作为三维物体分类的基准数据集,其地位类似于图像领域的MNIST,是入门和评估模型性能的通用标准。理解其数据格式与加载原理,是进行点云分类、分割等任务的关键前置步骤。通过PyTorch的Dataset类,开发者可以构建高效的数据管道,将原始点云文件转换为神经网络可直接处理的张量格式,这一过程涉及数据采样、归一化、特征组装等核心操作,直接影响模型的训练效率和最终性能。本文聚焦于ModelNet10/40数据集,详细解析其目录结构,并提供一套稳健的 阅读详情

相关推荐

软件测试工程师最常用的Linux系统命令大全(汇总)

cd命令这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。

1330

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

EB Tresos激活失败?3种实用解决方案帮你搞定(含离线激活步骤)

本文针对EB Tresos软件激活失败问题,提供了三种实用的解决方案。详细分析了激活失败的常见根源,并系统阐述了在线环境下的排查步骤、无网环境下的离线激活全流程,以及高级许可证环境修复方法,帮助汽车电子工程师快速恢复开发环境。

milk8的博客 609

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

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

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

C++ (week6、7):Linux系统编程4:网络

Linux网络:计算机网络概述、TCP协议、Socket编程、IO多路复用机制(select、epoll)、HTTP协议、进程池、线程池、大文件网络传输问题

Edward2022的博客 1430

【LDPC-7】LLR量化位宽对LDPC译码性能的影响分析——以最小和译码算法为例进行matlab仿真

最小和译码算法的步骤如下:最后译码结果如果满足或者完成所有迭代次数,则译码算法停止迭代,否则继续进行译码迭代操作。

FPGA/MATLAB学习教程/源码/项目合作开发 1471

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

华为OD机试真题 2026-9-2【查找幸运数】

华为OD机试真题 新系统【查找幸运数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【查找幸运数】多语言题解。

qq_45776114的博客 498

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

HarmonyOS应用开发者基础认证

B. 自定义组件:可复用的 UI 单元,可组合其它组件。D. 内置组件:ArkTS中默认内置的基本组件和布局组件,开发者可以直接调用,如Column、Text、Divider、Button等。E. 属性方法:用于组件属性的配置,统一通过属性方法进行设置,如fontSize()、width()、height()、color() 等。在Column和Row容器组件中,justifyContent用于设置子组件在主轴方向上的对齐格式,alignItems用于设置子组件在交叉轴方向上的对齐格式。

牛肉胡辣汤 3818

FPGA 学习笔记:Vivado 配置IO引脚约束

FPGA 学习笔记:Vivado 配置IO引脚约束

坚韧与专注 2万+

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

七九河开的博客 304

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

Iguodala的博客 625

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

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 motorests. Charlie hates change. That is basically the ...

王小二的博客 1646
上一篇: 【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、付费专栏及课程。

余额充值