Coin Change
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 21645 Accepted Submission(s): 7577
Problem Description
Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cent. We want to make changes with these coins for a given amount of money.
For example, if we have 11 cents, then we can make changes with one 10-cent coin and one 1-cent coin, or two 5-cent coins and one 1-cent coin, or one 5-cent coin and six 1-cent coins, or eleven 1-cent coins. So there are four ways of making changes for 11 cents with the above coins. Note that we count that there is one way of making change for zero cent.Write a program to find the total number of different ways of making changes for any amount of money in cents. Your program should be able to handle up to 100 coins.
For example, if we have 11 cents, then we can make changes with one 10-cent coin and one 1-cent coin, or two 5-cent coins and one 1-cent coin, or one 5-cent coin and six 1-cent coins, or eleven 1-cent coins. So there are four ways of making changes for 11 cents with the above coins. Note that we count that there is one way of making change for zero cent.Write a program to find the total number of different ways of making changes for any amount of money in cents. Your program should be able to handle up to 100 coins.
Input
The input file contains any number of lines, each one consisting of a number ( ≤250 ) for the amount of money in cents.
Output
For each input line, output a line containing the number of different ways of making changes with the above 5 types of coins.
Sample Input
11 26
Sample Output
4 13
代码及注释:
//附上详细的注释只是想让在看的你更加容易理解,不需要去句句斟酌浪费时间;
//写的很仓促,有写的不好的地方还请包涵谢谢
#include<iostream>
using namespace std;
int coin[]={50,25,10,5,1};
int countt;//累计种数
int account=0;//输入金币
void change(int num,int j,int coinnum)
{
if(num==account&&coinnum<=100)//累计和num等于输入金额&&硬币个数小于等于100个,计数
countt++;
else if(num>account||coinnum>100)//累计和num大于输入金额||硬币个数大于100个,结束
return;
else//累计和num小于输入金额,继续递归
for(int i=j;i<5;i++)
{
j=i;coinnum+=1;//这里加了个j是因为coin[0-->j]面值的硬币在前面已经算过了,比如:account=50;第一次递归:j=i=0;coinnum=0+1;
change(num+coin[i],j,coinnum);//change(0+50,0,1);第二次递归开始:if(num==account&&coinnum<=100) 满足,计数,结束
coinnum-=1; //coinnum==coinnum-1==1-1==0;i++,i=1;j=1,即去掉50;coinnum=1;change(25,1,1)第三次递归开始:
} //25小于50,继续递归;i=j=1(设置j用以就在此,不然如果i从0开始会重复计数)j=1;coinnum=1+1=2;
//chang(25+25,1,2);第四次递归开始:if(num==account&&coinnum<=100) 满足,计数,结束
//*
//*
//*
} //如果没有j,像(25,10,10,5),(10,25,10,5},{5,25,10,10}会重复
int main()
{
account=0;
while(cin>>account)
{
countt=0;
change(0,0,0);
cout<<countt<<endl;
account++;
}
return 0;
}
//写的很仓促,有写的不好的地方还请包涵谢谢
#include<iostream>
using namespace std;
int coin[]={50,25,10,5,1};
int countt;//累计种数
int account=0;//输入金币
void change(int num,int j,int coinnum)
{
if(num==account&&coinnum<=100)//累计和num等于输入金额&&硬币个数小于等于100个,计数
countt++;
else if(num>account||coinnum>100)//累计和num大于输入金额||硬币个数大于100个,结束
return;
else//累计和num小于输入金额,继续递归
for(int i=j;i<5;i++)
{
j=i;coinnum+=1;//这里加了个j是因为coin[0-->j]面值的硬币在前面已经算过了,比如:account=50;第一次递归:j=i=0;coinnum=0+1;
change(num+coin[i],j,coinnum);//change(0+50,0,1);第二次递归开始:if(num==account&&coinnum<=100) 满足,计数,结束
coinnum-=1; //coinnum==coinnum-1==1-1==0;i++,i=1;j=1,即去掉50;coinnum=1;change(25,1,1)第三次递归开始:
} //25小于50,继续递归;i=j=1(设置j用以就在此,不然如果i从0开始会重复计数)j=1;coinnum=1+1=2;
//chang(25+25,1,2);第四次递归开始:if(num==account&&coinnum<=100) 满足,计数,结束
//*
//*
//*
} //如果没有j,像(25,10,10,5),(10,25,10,5},{5,25,10,10}会重复
int main()
{
account=0;
while(cin>>account)
{
countt=0;
change(0,0,0);
cout<<countt<<endl;
account++;
}
return 0;
}
觉得有用的话就赞一个吧亲
ps:第一次在csdn上写文章