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件物品,重量
分别是w1,w2,w3,…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;
}