人民币的面值有100、50、20、10、5、2、1元。请你输出找零纸币数最少的方案
输入格式:
两个整数,分别表示付款金额和消费金额
输出格式:
输入找零方案。包含若干行,每行包含两个数字,纸币面额和纸币数量
样例">输入样例:
10 3
输出样例:
在这里给出相应的输出。例如:
5 1
2 1
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
首先我写出一个这样的程序:
因为内存访问越界把int变量覆盖了,所以值会自动篡改;用被注释的代码检查就可以很明显地看出来,不是赋值编码错误,就是比较奇怪。
#include <bits/stdc++.h>
using namespace std;
int money_face[7]={100,50,20,10,5,2,1};
void Cal_return(int money,int i){
if(money==0){
return;
}
int num=0;
for(;i<7;i++){
// cout<<money<<"money1"<<endl;
if(money>=money_face[i]){
num=money/money_face[i];
cout<<money_face[i]<<" "<<num<<endl;
money=money-money_face[i]*num;
if(money==0){
cout<<"money=0"<<endl;
break;
return;//笑死,完全不出来
}
Cal_return(money,i++);
}
// cout<<money<<"money3"<<endl;
//内存访问越界把int变量覆盖了。
}
}
int main(){
int payment,comsumption;
cin>>payment>>comsumption;
int money=payment-comsumption;
if(money<0){
cout<<0<<endl;
}
else{
Cal_return(money,0);
}
}
更改思路:不断地更改限制进入下一个递归的路径;有一点蠢但是真的有用,详细见注释。
#include <bits/stdc++.h>
using namespace std;
int money_face[7]={100,50,20,10,5,2,1};
void Cal_return(int money,int i){
if(money==0){
return;
}
int num=0;
for(;i<7;i++){
// cout<<money<<"money1"<<endl;
if(money>=money_face[i]){
num=money/money_face[i];
cout<<money_face[i]<<" "<<num<<endl;
money=money-money_face[i]*num;
if(money==0){
return;//笑死,完全不出来
}
else{
Cal_return(money,i++); //要else了才能不进入递归
}
return;//没进入还是记得得return;
}
// cout<<money<<"money3"<<endl;
//内存访问越界把int变量覆盖了。
}
}
int main(){
int payment,comsumption;
cin>>payment>>comsumption;
int money=payment-comsumption;
if(money<0){
cout<<0<<endl;
}
else{
Cal_return(money,0);
}
}