找零钱
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
我们知道人民币有1、2、5、10、20、50、100这几种面值。
现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。
比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。
现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。
比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。
输入
输入有多组,每组一行,为一个整合n。 输入以0结束。
输出
输出该面额有几种表示方法。
示例输入
1 4 0
示例输出
1 3
废话不多说了。。直接枚举肯定超时。。
#include <iostream> //找零钱 暴力枚举+剪枝 using namespace std; #include <cstdio> int main() { int a,b,c,d,e,f,n; while(cin>>n) { int count=0; if(n==0) break; for(a=0;a<=n/100;a++) //从100元到1元往下枚举 { for(b=0;b<=n/50;b++) { if(n-(a*100+b*50)<0) break; //如果此时100元和50元的面值已经大于所给值,再往下枚举没意义,下面类同 for(c=0;c<=n/20;c++) { if(n-(a*100+b*50+c*20)<0) break; for(d=0;d<=n/10;d++) { if(n-(a*100+b*50+c*20+d*10)<0) break; for(e=0;e<=n/5;e++) { if(n-(a*100+b*50+c*20+d*10+e*5)<0) break; for(f=0;f<=n/2;f++) { if(n-(a*100+b*50+c*20+d*10+e*5+f*2)<0) break; int g=n-(a*100+b*50+c*20+d*10+e*5+f*2); if(n==a*100+b*50+c*20+d*10+e*5+f*2+g&&a+b+c+d+e+f+g<=100) count++; } } } } } } cout<<count<<endl; } return 0; }