基础算法--递归(一)

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))

returnMaxVal(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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值