POJ1787 【完全背包+物品计数+路径输出】
题意:
有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 【完全背包+物品计数+路径输出】的更多相关文章
- UVA--624 CD(01背包+路径输出)
题目http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- PAT L3-001 凑零钱(01背包dp记录路径)
韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...
- Unity — — UGUI之背包物品拖放
最新背包代码: Unity3D — — UGUI之简易背包 Unity版本:2017.3 功能:用UGUI实现简单的背包物品拖放/交换功能 一.简介 在UGUI下,物品的拖放脚本实现主要依赖于Unit ...
- [POJ] 1606 Jugs(BFS+路径输出)
题目地址:http://poj.org/problem?id=1606 广度优先搜索的经典问题,倒水问题.算法不需要多说,直接BFS,路径输出采用递归.最后注意是Special Judge #incl ...
- java实现将指定文件夹里所有文件路径输出到指定文件作为参数化文件给lr脚本使用
java实现将指定文件夹里所有文件路径输出到指定文件作为参数化文件给lr脚本使用 import java.io.BufferedReader; import java.io.BufferedWrite ...
- Floyd最短路(带路径输出)
摘要(以下内容来自百度) Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似. 该算法名称以创始人之一.1978年图灵奖获得者. ...
- 【CH5104】I-country 线性dp+路径输出
pre:在网格中,凸多边形可以按行(row)分解成若干段连续的区间 [ l , r ] ,且左端点纵坐标的值(col)满足先减后增,右端点纵坐标先增后减. 阶段:根据这个小发现,可以将阶段设置成每一行 ...
- URAL 1004 Sightseeing Trip(floyd求最小环+路径输出)
https://vjudge.net/problem/URAL-1004 题意:求路径最小的环(至少三个点),并且输出路径. 思路: 一开始INF开大了...无限wa,原来相加时会爆int... 路径 ...
- 洛谷 P2764 最小路径覆盖问题【最大流+拆点+路径输出】
题目链接:https://www.luogu.org/problemnew/show/P2764 题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V ...
随机推荐
- 【Nutch基础教程之七】Nutch的2种执行模式:local及deploy
在对nutch源码执行ant runtime后,会创建一个runtime的文件夹.在runtime文件夹下有deploy和local 2个文件夹. [jediael@jediael runtime]$ ...
- 走入asp.net mvc不归路:[4]说说Action有哪些常见成员
一个控制器中,功能最终会落实到一个个Action中实现,最常见的是增删查改操作.这些Action是一个个的方法,一般返回值是ActionResult,并且是public 方法,可以带参数,可以添加元标 ...
- 如何卸载centos中自带的Java
首先通过 Java -version 来查看是否已经安装了java 然后通过rpm -qa | grep java 来获得java的版本信息 然后再 用 rpm -e --nodeps [这里依次 ...
- 【转载】C# 理解泛型
术语表 generics:泛型type-safe:类型安全collection: 集合compiler:编译器run time:程序运行时object: 对象.NET library:.Net类库va ...
- Linux安装配置Redis CentOS 7 下安装Redis
Redis是一个高性能的,开源key-value型数据库.是构建高性能,可扩展的Web应用的完美解决方案,可以内存存储亦可持久化存储.因为要使用跨进程,跨服务级别的数据缓存,在对比多个方案后,决定使用 ...
- LeetCode(26)题解:Remove Duplicates from Sorted Array
https://leetcode.com/problems/remove-duplicates-from-sorted-array/ Given a sorted array, remove the ...
- Erlang Garbage Collector
Erlang Garbage Collector | Erlang Solution blog https://www.erlang-solutions.com/blog/erlang-garbage ...
- IE67 下 setattribute class 失效
解决办法.将class 换成 className ,同理.ff不能识别className,将其换成class element.setAttribute("class"," ...
- spring cloud 服务消费
Ribbon Ribbon可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用. 当Ribbon与Eureka联合使用时,ribbonServerList会 ...
- FMDB 使用技巧
源链接: http://blog.csdn.net/iunion/article/details/7091744 - (BOOL) isTableOK:(NSString *)tableName{ ...