1、输入一串以‘!’结束的字符,按逆序输出。(用递归做)
#include <cstdio> void sort() { char ch; if((ch=getchar())!='!') { sort() ; putchar(ch); } return; } int main() { sort(); }2、背包问题 问题:假设有n件质量分配为w1,w2,…,wn的物品和一个最多能装载总质量为T的背包,能否从这n件物品中选择若干件物品装入背包,使得被选物品的总质量恰好等于背包所能装载的最大质量,即wi1+wi2+…+wik=T。若能,则背包问题有解,否则无解。 (例如:有5件可选物品,质量分别为8千克、4千克、3千克、5千克、1千克。假设背包的最大转载质量是10千克。)
#include<iostream> using namespace std; int k(int s,int n,int a[]) { if(s==0) { return (1); } else { if(s<0||(s>0&&n<1)) { return (0); } else { if(k(s-a[n-1],n-1,a)) { cout<<"number:"<<n<<" "<<"weight:"<<a[n-1]<<endl; return (1); } else { return k(s,n-1,a); } } } } int main() { int S,n,a[100],t; cin>>n>>S; for(int i=0;i<n;i++) cin>>a[i]; t=k(S,n,a); if(t==0) cout<<"not found"<<endl; }3、阿克曼(Ackmann)函数A(x,y)中,x,y定义域是非负整数,函数值定义为: akm(m,n) = n+1; (m=0时)
akm(m,n) = akm(m-1,1); (m>0,n=0时)
akm(m,n) = akm(m-1,akm(m, n-1)); (m,n>0时) 写出计算Ack(m,n)的递归算法程序。
#include <iostream> #include<cstdio> using namespace std; int akm(int m,int n){ if(m==0) return n+1; if(m>0&&n==0)return akm(m-1,1); return akm(m-1,akm(m, n-1)); } int main(){ int m,n; cin>>m>>n; cout<<akm(m,n); }4、某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封共有多少种不同情况。 基本形式:d[1]=0;d[2]=1 递归式:d[n]= (n-1)*( d[n-1] + d[n-2])
#include <iostream> #include<cstdio> using namespace std; int ak(int n){ int d[101]; d[1]=0; d[2]=1; for(int i=3;i<=n;i++) { d[i]=(i-1)*(d[i-1]+d[i-2]); } return d[n]; } int main(){ int n; cin>>n; cout<<ak(n); }5、有52张牌,使它们全部正面朝上,从第2张开始,凡是2的倍数位置上的牌翻成正面朝下;接着从第3张牌开始,凡是3的倍数位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;接着第三轮从第4张牌开始,凡是4的倍数位置上的牌按上面相同规则翻转,以此类推,直到第1张要翻的牌是第52张为止。统计最后有几张牌正面朝上,以及它们的位置号。
#include<iostream> using namespace std; int a[1001];// 0正面朝上 void f(int n) { if(n==53) return; else { for(int i=1;i<=52;i++) { if(i%n==0) { if(a[i]==0) a[i]=1; else a[i]=0; } } f(n+1); } } int main() { f(2); int tot=0; for(int i=1;i<=52;i++) { if(a[i]==0) { tot++; cout<<i<<" "; } } cout<<endl; cout<<tot; return 0; }6、猴子吃桃问题 猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉的一半,又多吃了一个。以后每天早上都吃掉了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。(答案:1534)
#include <cstdio> int main() { int i,n=1; for(i=9;i>=1;i--) { n=(n+1)*2; } printf("第1次共摘了%d个桃子\n",n); return 0; }