1 问题描述: 我们知道人民币有1,2,5,10,20,50,100这几种面值,现在给你n(1<=n<=250)元让你计算换成用上面这些面额表示且总数不超过100张,共有几种。比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。
输入有多组,每组一行,为一个集合n,输入以0结束
输出该面值有几种表示方法.
输入输出实例:
input: 1
4
0
output: 1
3
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;
int num[] = {1,2,5,10,20,50,100};
int ChangeMoney(int money,int index){
if (money==0||money==1||index==0) return 1;
if (index<0||money<0) return 0;
return ChangeMoney(money, index - 1) + ChangeMoney(money-num[index],index);
}
int main(){
int n;
queue<int> kinds;
while (cin>>n)
{
if (n==0)
break;
for (int i = 6; i>=0; i--){
if (n >= num[i]){
kinds.push(ChangeMoney(n,i));
break;
}
}
}
while (!kinds.empty())
{
cout << kinds.front() << endl;
kinds.pop();
}
system("pause");
return 0;
}
问题1 怎么知道不超过100张
2 问题描述:给定两个非常大的正整数A和B,位数在50至100之间,求C=A+B
因为A和B很大,从高位到低位,以字符串的形式输入两行数字A和B,A和B的位数在50到100之间。以字符串的形式输出一行
输入:111111111111111111111111111
222222222222222222222222222
输出:333333333333333333333333333
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string SumBigString(string A,string B){
int len=(A.size()>B.size())?A.size()-B.size():B.size()-A.size();
A.size()>B.size()?B=string(len,'0')+B:A=string(len,'0')+A;
string C(A.size(),' ');
int carry=0;
for(int i=A.size()-1;i>=0;i--){
C[i]=(A[i]-'0'+B[i]-'0'+carry)%10+'0';
carry=(A[i]-'0'+B[i]-'0'+carry)/10;
}
if(carry>0){
C.insert(0,1,carry+'0');
}
return C;
}
int main(){
string A="958669";
string B="789896";
string C=SumBigString(A,B);
cout<<C<<endl;
system("pause");
return 0;
}
3 问题描述:给定一个正整数N代表火车数量,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号,要求以字典序排序输出火车出站的序列号。
输入 有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9,输出以字典序排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample
样例输入:3
1 2 3
1 2 3
1 3 2
样例输出:2 1 3
2 3 1
3 2 1
分析:原题等价于:对于入栈序列1,2,3,将可能的出栈序列全部列出来!
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
bool check(string str){
char b;
bool flag=true;
for (int i = 0; i<str.size()-1; i++){
int m=0;
for (int j = i + 1; j<str.size(); j++){
if (str[i]>str[j]){
if(m==0) b= str[j],m++;
else
{
if (str[j]>b)
flag=false;
else
{
b = str[j];
}
}
}
}
}
return flag;
}
void Permutation(string str, int begin, int end){
if (begin == end - 1){
if (check(str)) {
for (int i=0;i<str.size();i++)
cout << str[i] << " ";
cout<<endl;
return ;
}
}
for (int k = begin; k <end; k++){
swap(str[k],str[begin]);
Permutation(str,begin+1,end);
swap(str[k],str[begin]);
}
}
int main(){
int n;
cin>>n;
int a;
string str;
for (int i = 0; i < n; i++){
cin>>a;
str.insert(str.size(),1,a+'0');
}
Permutation(str, 0, str.size());
system("pause");
return 0;
}