这道题算是一道很经典的题,很好的诠释了贪心和动态规划的不同功能。求最少钱的数量用贪心就够了,但是求最多钱的数量要用到动态规划的思想,每步都尽量保留最大

数量。具体看程序注解:

#include"iostream"
#include"stdio.h"
#include"algorithm"
#include"string.h"
#include"cmath"
using namespace std;
int fewest(int a[],int num[],int price)
{
int i;
int ans=;
for(i=;i>;i--)
{
if(price>=num[i]*a[i])
{
ans+=num[i];
price-=num[i]*a[i];
}
else
{
ans+=price/a[i];
price%=a[i];
}
}
if(price>num[])return -;
else return ans+price;
}
//这个函数的整体思想就是先保留全部的小钱,用大钱补缺,这样就可以得到最大数量
int largest(int a[],int num[],int price)
{
int i;
int ans=;
int sum[];
sum[]=num[];
for(i=;i<;i++)
{
sum[i]=sum[i-]+a[i]*num[i];
}
for(i=;i>;i--)
{
if(price<=sum[i-])continue;
else
{
int t;
//先用满足条件的最大面值,如果有余数,所用张数+1,
//不足的部分用较小面值的进行补
t=((price-sum[i-])/a[i])+(((price-sum[i-])%a[i])?:);
ans+=t;
price-=t*a[i];
}
}
return ans+price;
}
int main()
{
int t,price,i,j;
int a[]={,,,,,};//面值
int num[];//数量
cin>>t;
while(t--)
{
cin>>price;
int sum=;
for(i=;i<=;i++)
{
cin>>num[i];
sum+=num[i]*a[i];
}
if(sum<price) {cout<<"-1 -1"<<endl;continue;}
int mi=fewest(a,num,price);
if(mi==-) {cout<<"-1 -1"<<endl;continue;}
int mx=largest(a,num,price);
cout<<mi<<" "<<mx<<endl;
}
return ;
}

hdu 3348 coins的更多相关文章

  1. HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...

  2. 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)

    作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢htt ...

  3. HDU 2844 Coins (多重背包计数 空间换时间)

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  4. hdu 2844 Coins

    Coins Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted S ...

  5. hdu 2844 Coins (多重背包)

    题意是给你几个数,再给你这几个数的可以用的个数,然后随机找几个数来累加, 让我算可以累加得到的数的种数! 解题思路:先将背包初始化为-1,再用多重背包计算,最后检索,若bb[i]==i,则说明i这个数 ...

  6. POJ 1742 hdu 2844 Coins

    题目链接:http://poj.org/problem?id=1742 http://acm.hdu.edu.cn/showproblem.php?pid=2844 题目分类:动态规划 代码: #in ...

  7. hdu 2844 Coins (多重背包+二进制优化)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:多重背包 , dp[i] ,容量为i的背包最多能凑到多少容量,如果dp[i] = i,那么代表 ...

  8. hdu 2844 coins(多重背包 二进制拆分法)

    Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...

  9. hdu 2844 Coins 多重背包(模板) *

    Coins                                                                             Time Limit: 2000/1 ...

随机推荐

  1. 学习cocos-js的准备工作

    我学习 cocos2d-js 的方向: 学习 cocos2d-js 的 HTML5 版本:即 canvas 渲染. 下载cocos-js 文件 地址: http://www.cocos2d-x.org ...

  2. Java如何读取XML文件 具体实现

    转载自:http://www.jb51.net/article/44338.htm import java.io.*; import javax.xml.parsers.DocumentBuilder ...

  3. 【linux】awk的使用

    教程来自:http://www.runoob.com/linux/linux-comm-awk.html 教程中的例子很好,可以有助于快速上手awk.但是里面的细节介绍的并不清楚. 问题1:什么时候写 ...

  4. eclipse 向HDFS中创建文件夹报错 permission denied

    环境:win7  eclipse    hadoop 1.1.2 当执行创建文件的的时候, 即: String Path = "hdfs://host2:9000"; FileSy ...

  5. linux dd命令刻录启动U盘详解

    dd if=xxx.iso of=/dev/sdb bs=1M 用以上命令前必须卸载u盘,sdb是你的u盘,bs=1M是块的大小,后面的数值大,写的速度相对块一点,但也不是无限的,我一般选2M,注意, ...

  6. Linux防火墙规则的查看、添加、删除和修改

    这里只列出比较常用的参数,详细的请查看man iptables 1.查看 iptables -nvL –line-number -L查看当前表的所有规则,默认查看的是filter表,如果要查看NAT表 ...

  7. Java Hour 35 Weather ( 8 ) struts2 – message resource

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. Hour 35 刚发表了一条闪存,在这个公司快满3个月了,该正式决定留下来还是 ...

  8. Azure Blob Storage从入门到精通

    今天推荐的是一个系列文章,让读者阅读完成后可以对Azure Blob Storage的开发有一个全面的了解,可谓是从入门到精通. Azure在最初的版本里面就提供了非结构化数据的存储服务,也即Blob ...

  9. 什么是AIDL(转)

    跨进程访问的服务称为AIDL(Android Interface Definition Language)服务. AIDL:Android Interface Definition Language, ...

  10. open(/dev/ietctl, O_RDWR) 参数含义(转载)

    这是文件I/O的常用函数,open函数,open函数用来打开一个设备,他返回的是一个整型变量,如果这个值等于-1,说明打开文件出现错误,如果为大于0的值,那么这个值代表的就是文件描述符.一般的写法是i ...