您的位置:首页 > 其它

Sicily.找零总数

2015-12-30 00:49 225 查看

Sicily.找零总数

Description

小李是超市的收银员,每当顾客来结账时,他们给的钱往往都多余他们所购物品的实际价格,这时,小李就需要找零给他们。小李是一个很爱思考的人,他想知道在目前的纸币面额情况下(1角、5角、1元、5元、10元、20元、50元、100元),如果每种面额的纸币的数量都是无限的,他要给一个顾客找零N(0 < N < 100)元有多少种方式(如0.5元有两种方式:5个1角和1个5角)。小李很苦恼这个问题,聪明的你能帮助他吗?

Input

输入包括多组测试用例,通过EOF结束。

每组测试用例包括一行,为一个数N (1< N < 100),N为最多包含一位小数的实数。

Output

对于每组测试用例,输出一行,为一个整数,表示找零的方法总数。

Time Limit: 1sec Memory Limit:256MB

以下是智能暴力枚举法:

结果居然能过,但是

不推荐!

这里暴力枚举的思路是八层循环,由外至里循环依次增多,使得所有面值的纸币的线性组合刚好是给定的金额。

智能化思路

如果所有纸币线性组合的金额超过的给定的金额,直接continue;

如果只用1角钱,所需的数量是x个,那么之后的解的1角钱的数量必定是 x%5 + 5*k 的形式(k = 0,1,2….)

#include <stdio.h>
#include <math.h>

int t = 0; // 所谓的x%5 后的结果
int s = 1;

int main(){

double money;
int counter;
int j1, j5, y1, y5, y10, y20, y50, y100;// 分别为1角,5角,1元,5元,10元,20元,50元, 100元
while( scanf("%lf", &money) != EOF){
counter = 0;
for(y100 = 0; y100 <= 1; y100++){// 可怕的八重循环
if( 100.0*y100 - money > 0.00000001)continue;

for(y50 = 0; y50 <= 2; y50++){
if(100.0*y100+50.0*y50 - money > 0.00000001)continue;

for(y20 = 0; y20 <= 5; y20++){
if(100.0*y100+50.0*y50+20.0*y20 - money > 0.00000001)continue;

for(y10 = 0; y10 <= 10; y10++){
if(100.0*y100+50.0*y50+20.0*y20+10.0*y10 - money > 0.00000001)continue;

for(y5 = 0; y5 <= 20; y5++){
if(100.0*y100+50.0*y50+20.0*y20+10.0*y10+5.0*y5 - money > 0.00000001)continue;

for(y1 = 0; y1 <= 100; y1++){
if(100.0*y100+50.0*y50+20.0*y20+10.0*y10+5.0*y5+1.0*y1 - money > 0.00000001)continue;

for(j5 = 0; j5 <= 200; j5++){
if(100.0*y100+50.0*y50+20.0*y20+10.0*y10+5.0*y5+1.0*y1+0.5*j5 - money > 0.00000001)continue;

for(j1 = t; j1 <= 1000;j1+=s){
if(100.0*y100+50.0*y50+20.0*y20+10.0*y10+5.0*y5+1.0*y1+0.5*j5+0.1*j1 - money > 0.00000001)continue;
if(fabs(100.0*y100+50.0*y50+20.0*y20+10.0*y10+5.0*y5+1.0*y1+0.5*j5+0.1*j1 - money) < 0.00000001){
counter++;
t = j1 % 5; //注意
s = 5;
}
}
}
}
}
}
}
}
}
printf("%d\n",counter);
t = 0;// 再初始化 方便下一个样例
s = 1;
}
return 0;
}


动态规划算法:

等待更新ing
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: