基础算法--递归(一)

来源:互联网 发布:windows修改网络命令 编辑:程序博客网 时间:2024/04/29 06:17

 

1.汉诺塔

#include <iostream>

using namespace std;

 

void fac(int n, char A, char B, char C)

{

if (n==1) cout<<"move "<<n<<": "<<A<<"-->"<<C<<endl;

else

{

fac(n-1,A,C,B);

cout<<"move "<<n<<": "<<A<<"-->"<<C<<endl;

fac(n-1,B,A,C);

}

}

 

int main()

{

int n;

cin>>n;

fac(n,'A','B','C');

return 0;

}

 

2.普通背包问题

设有一个背包可以放入的物品重量为S,现有n件物品,重量

分别是w1w2w3,…wn。问能否从这n件物品中选择若干件

放入背包中,使得放入的重量之和正好为S。如果有满足条件的

选择,则此背包有解,否则此背包问题无解。

 

#include <iostream>

using namespace std;

 

int knap(int s,int n,int w[])

{

 

if(s==0)   return 1;

if(s<0||n<1) return 0;

if(knap(s-w[n-1],n-1,w)==1)

{

cout<<w[n-1]<<" "<<endl;

return 1;

}

return knap(s,n-1,w);

}

 

int main()

{

int s,n;

int w[5]={1,3,5,7,9};

s=20;

n=5;

int x=knap(s,n,w);

if(x==1)

cout<<"问题有解"<<endl;

else

cout<<"问题无解"<<endl;

 

return 0;

}

 

3. 0-1背包

 

#include <iostream>

using namespace std;

int timeval[110];

int val[110];

 

  int MaxVal(int n, int s)

  {

  if(n<=0 || s<=0) return 0;

  if( timeval[n]<=s && (MaxVal(n-1,s-timeval[n])+val[n])>MaxVal(n-1,s))

return        MaxVal(n-1,s-timeval[n])+val[n];

return MaxVal(n-1,s);

}

 

  int main()

  {

  int s,n,i;

  cin>>s>>n;

  for (i=1; i<=n; i++)

  cin>>timeval[i]>>val[i];

  cout<<MaxVal(n,s)<<endl;

  return 0;

}

原创粉丝点击