题意:

有1,5,10,25四种硬币,给每种硬币的数量和要组合成的价值,求刚好达到价值时用的硬币最多,然后还要输出具体的用的数量

前言:

一开始是偶然看见了kuangbin爷的题解说是完全背包+路径,很好奇啊。

思路(kuangbin爷代码 Orz):

一个完全背包,加个计数,加个路径。

因为题目要求是求一个max硬币数量,所以直观上我们感觉就是面值小的硬币用的越多越好,然后在dp更新的时候,基于小面值使用大面值。所以val数组是从小到大,目的是尽可能使用更多的小面值硬币达到dp数组是每次都是最多的。然而如果是求最小硬币数,直接就可以把面值数组掉一下头就好啦~

突然有个问题(太弱就会瞎想):

有没有存在可能被给出的P面值没有被更新到,虽然dp数组判断条件是判断谁大,所以初始化0就好了(P>=1),一旦符合就是有符合的条件。所以是成立。

忽略以上的问题,利用完全背包的思想:

首先在更新的时候必须保证dp[j-val[i]]>=0的,第一枚硬币的更新是以 j-val[i] = 0为基础开始的,以至于dp数组才可以代表的是 j 面值的最大硬币数。所以初始化dp是负数。

然后加一个cnt,非常nice的一个想法。

具体写法:

①:我们可以开一个num数组去记录某价值下的某硬币的使用情况。

②:我们可以开个pre数组去记录一下某 j 面值的前面的j-val[i],然后递归到0,中间的差值就是被使用价值的硬币,再开一个数组记录一下就好了。

除了这个方法,还有多重背包+路径;

贴一发挫code……….

#include<cstdio>
#include<iostream>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define eps 1e-8
typedef __int64 LL; const int N=1e4+10; int val[4]={1,5,10,25}; int dp[N]; //在该面值的最大硬币数量
int num[5];
int pre[N];//记录背包路径
int cnt[N];//每次更新是临时计数
int ans[30]; //计数 int main()
{
int n;
int t;
bool flag=true;
while(1)
{
scanf("%d",&t);
for(int i=0;i<4;i++)
{
scanf("%d",&num[i]);
if(num[i]) flag=true;
}
if(!t&&!num[0]&&!num[1]&&!num[2]&&!num[3]) break;//在这里wa了,以后判0乖乖这样做。 memset(pre,0,sizeof(pre));
memset(dp,-1,sizeof(dp)); dp[0]=0;
pre[0]=-1; for(int i=0;i<4;i++)
{
memset(cnt,0,sizeof(cnt));
for(int j=val[i];j<=t;j++)
{
if(dp[j-val[i]]>=0&&(dp[j-val[i]]+1)>dp[j]&&num[i]>cnt[j-val[i]])//首先dp[j-val[i]]>=0,因为要保证你前面那个是满足的
{
dp[j]=dp[j-val[i]]+1;
cnt[j]=cnt[j-val[i]]+1;
pre[j]=j-val[i];
}
}
} if(dp[t]<0)
{
printf("Charlie cannot buy coffee.\n");
continue;
}
//printf("%d\n",dp[t]); memset(ans,0,sizeof(ans));
int x=t;
while(1)
{
if(pre[x]==-1) break;
ans[x-pre[x]]++;
x=pre[x];
}
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",ans[1],ans[5],ans[10],ans[25]);
}
return 0;
}

POJ1787 【完全背包+物品计数+路径输出】的更多相关文章

  1. UVA--624 CD(01背包+路径输出)

    题目http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. PAT L3-001 凑零钱(01背包dp记录路径)

    韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...

  3. Unity — — UGUI之背包物品拖放

    最新背包代码: Unity3D — — UGUI之简易背包 Unity版本:2017.3 功能:用UGUI实现简单的背包物品拖放/交换功能 一.简介 在UGUI下,物品的拖放脚本实现主要依赖于Unit ...

  4. [POJ] 1606 Jugs(BFS+路径输出)

    题目地址:http://poj.org/problem?id=1606 广度优先搜索的经典问题,倒水问题.算法不需要多说,直接BFS,路径输出采用递归.最后注意是Special Judge #incl ...

  5. java实现将指定文件夹里所有文件路径输出到指定文件作为参数化文件给lr脚本使用

    java实现将指定文件夹里所有文件路径输出到指定文件作为参数化文件给lr脚本使用 import java.io.BufferedReader; import java.io.BufferedWrite ...

  6. Floyd最短路(带路径输出)

    摘要(以下内容来自百度) Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似. 该算法名称以创始人之一.1978年图灵奖获得者. ...

  7. 【CH5104】I-country 线性dp+路径输出

    pre:在网格中,凸多边形可以按行(row)分解成若干段连续的区间 [ l , r ] ,且左端点纵坐标的值(col)满足先减后增,右端点纵坐标先增后减. 阶段:根据这个小发现,可以将阶段设置成每一行 ...

  8. URAL 1004 Sightseeing Trip(floyd求最小环+路径输出)

    https://vjudge.net/problem/URAL-1004 题意:求路径最小的环(至少三个点),并且输出路径. 思路: 一开始INF开大了...无限wa,原来相加时会爆int... 路径 ...

  9. 洛谷 P2764 最小路径覆盖问题【最大流+拆点+路径输出】

    题目链接:https://www.luogu.org/problemnew/show/P2764 题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V ...

随机推荐

  1. UITabBarController ---- 标签视图控制器

    直接上代码: // // AppDelegate.m // // #import "AppDelegate.h" #import "RootViewController. ...

  2. 《C++ Primer Plus》学习笔记9

    <C++ Primer Plus>学习笔记9 第15章 友元.异常和其他 <<<<<<<<<<<<<<& ...

  3. 关于android 使用bitmap的OOM心得和解决方式

    android开发,从2010年開始学习到如今的独立完毕一个app,这漫长的四年,已经经历了非常多次bug的折磨.无数次的加班训练.然而,自以为自己已经比較了解android了,却近期在一个项目上.由 ...

  4. Android-studio 连接真机 调试weex项目

    1.选择项目 platforms  /  android 2.创建虚拟机(AVD) (1)点击 AVD Manager (2) 点击  Create Virtual Device 最后发现 CPU 不 ...

  5. 安卓自带下拉刷新SwipeRefreshLayout加入上拉刷新功能

    在项目里面要用到刷新库.曾经都是使用第三方的.只是看到官方出了  SwipeRefreshLayout之后就用SwipeRefreshLayout.可是不知道什么原因官方SwipeRefreshL ...

  6. 【转载】win7下IIS的安装和配置图文教程

    1. 首先是安装IIS.打开控制面板,找到"程序与功能",点进去 2. 点击左侧"打开或关闭Windows功能" 3. 找到"Internet 信息服 ...

  7. Python中怎样用pip安装外部主机文件

    在python中安装非自带python模块.有三种方式: easy_install pip 下载压缩包(.zip, .tar, .tar.gz)后解压, 进入解压缩的文件夹后运行python setu ...

  8. UI类继承关系图

  9. 在Android Studio中修改应用包名

    紧凑模式下(包名中的每个字段紧贴在一起,例如),右键单击包名,Refactor -> Rename,只能修改包名最外层的字段 分离模式下(点击设置,将Hide Empty Middle Pack ...

  10. 序列化FastReport,重要提示少走弯路 good

    原本在开发一个报表插件,因为需要远程传输,因此需要序列化报表,序列化FastReport有两种方式, 1.仅序列化数据,由客户端接受到数据,并呈现报表,这种方式需要在客户端存储报表格式文件xxx.Fr ...