从m个数当中选择n个数,01规划结合搜索算法,
用递归函数写的,感觉效率不高,测试了一下用例24 12,感觉程序实在是跑不动了,不过对于一些小的用例还是可以的,在想办法优化了,
闲话少叙,上代码:
#include <iostream> using namespace std; int data[25]; int sum=0; void selectnfromm(int m,int n,int t) //t表示进入到第t层递归,即判断是否要挑选第t个数 { if(t==m) //判断是否已经检查了m个数 { int k=0; for(int i=0;i<m;i++) if(data[i]==1) k++; //对于当前已经挑选的数计数; if(k==n) //判断是否是一个可行的方案 { sum++; //方案数计算 for(int i=0;i<m;i++) //打印该方案 if(data[i]==1) cout<<(i+1); cout<<endl; } } else { if(t<m) //搜索所有的方案 { data[t]=1; //赋值为1使递归 selectnfromm(m,n,t+1); data[t]=0; //赋值为0使递归 selectnfromm(m,n,t+1); } } } int main() { int m,n; cout<<"输入m和n,从m中选n个(n<m<25):"<<endl; cin>>m>>n; for(int i=0;i<m;i++) data[i]=0; int t=0; cout<<"所有方案为:"<<endl; selectnfromm(m,n,t); cout<<"Sum:"<<sum<<endl; }