贪心算法—Problem F
来源:互联网 发布:天猫与淘宝流量对比 编辑:程序博客网 时间:2024/04/30 02:03
贪心算法—Problem F
题意
给你一个价格,还有面值分别为1,5,10,50,100(单位:毛)纸币的数量,要你用最少数量的纸币和最多数量的凑出这个价格,输出最少和最多的数量。如果凑不出来,输出"-1 -1"。
解题思路
最少的数量要用贪心的思想,优先取面值尽量大的纸币来凑这个价格。找最多的数量的纸币问题可以转化为手里剩余的纸币最少,所以,假设手上总共有money毛,而价格为p毛,我们用手上最少的数量的纸币去凑(money-p)毛,然后再用总数量减去该最少数量即可。
感想
把求最多和最少的纸币数量都转化为一种问题感觉简便很多,用几个循环凑数即可,这样使问题得到简化。
AC代码
#include<iostream>
using namespace std;
int main()
{
int T,i,j;
int p,r,k,money;
int min,max;
int a[]={1,5,10,50,100};
int b[10],c[10],d[10];
cin>>T;
for(i=0;i<T;i++)
{
money=0;
cin>>p;
for(j=0;j<5;j++)
{
cin>>b[j];
money+=a[j]*b[j];
}
r=p;
for(j=4;j>=0;j--)
{
if( (r/a[j]) < b[j] )
{
c[j]=r/a[j];
r-=a[j]*c[j];
}
else
{
c[j]=b[j];
r-=a[j]*c[j];
}
}
if(r!=0)
{
cout<<"-1 -1"<<endl;
}
else
{
k=money-p;
for(j=4;j>=0;j--)
{
if( (k/a[j]) < b[j] )
{
d[j]=k/a[j];
k-=a[j]*d[j];
}
else
{
d[j]=b[j];
k-=d[j]*a[j];
}
}
min=0;
max=0;
if(k==0)
{
for(j=0;j<5;j++)
{
min+=c[j];
}
for(j=0;j<5;j++)
{
max+=(b[j]-d[j]);
}
cout<<min<<""<<max<<endl;
}
}
}
}
- 贪心算法—Problem F
- 贪心算法 problem f(1006)
- 图算法—Problem F
- 贪心算法—Problem A
- 贪心算法—Problem E
- 贪心算法—Problem C
- 贪心算法—Problem G
- 贪心算法—Problem Q
- 贪心算法—Problem M
- 贪心算法—Problem N
- 贪心算法—Problem K
- 贪心算法—Problem R
- 贪心算法—Problem P
- 贪心算法—Problem O
- 贪心算法—problem j
- Problem F: 质心算法
- 贪心算法 Problem F 1005 花最少(数量)的纸币
- 贪心算法—Problem B&I
- xilinx器件封装信息
- linux命令:find 命令概览
- 数据存储——SQLite
- 198. House Robber
- 在 Android 上使用 RxNetty
- 贪心算法—Problem F
- No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
- 【Matlab开发】MATLAB编译C/C++代码
- RecyclerView的简单用法
- 图文说明Visual Studio 2013编译libpqxx步骤以及常见编译错误
- iOS崩溃捕获以及收集原理
- $GLOBALS['HTTP_RAW_POST_DATA']
- python中文乱码
- 全面剖析CSS Position定位