1、输入元素个数n和目标和c,输出子集合=c的一个子集
1 #include<iostream> 2 #include<cmath> 3 #include<cstdlib> 4 using namespace std; 5 int n,a[10000000],b[10000000],m,i,k=1,s=0; 6 bool f[10000000]; 7 void print(int k) 8 { 9 for (i=1;i<=k;++i)cout<<b[i]<<" "; 10 exit(0); 11 } 12 13 void gcd(int k,int s,int m) 14 { 15 int i; 16 if (s>m)return; 17 if (k>n){cout<<"No Solution!";exit(0);} 18 for (i=1;i<=n;++i) 19 if (f[i]) 20 { 21 f[i]=false; 22 s=s+a[i]; 23 b[k]=a[i]; 24 if (s==m){print(k);} 25 else gcd(k+1,s,m); 26 s=s-a[i]; 27 f[i]=true; 28 b[k]=0; 29 } 30 31 return ; 32 } 33 34 35 int main() 36 { 37 cin>>n; cin>>m; 38 for (i=1;i<=n;++i)cin>>a[i]; 39 for (i=1;i<=n;++i)f[i]=true; 40 gcd(k,s,m); 41 return 0; 42 }
2、 工作分配问题
1 #include <bits/stdc++.h> 2 using namespace std; 3 int tab[21][21],n,best=100000,r[21]; 4 int compute(int k) 5 { 6 int temp=0,i; 7 for(i=1;i<=k;i++) 8 temp+=tab[i][r[i]]; 9 return temp; 10 } 11 void search(int k) 12 { 13 if(k==n) 14 { 15 int temp=compute(n); 16 if(temp<best) 17 best=temp; 18 return; 19 } 20 for(int i=k;i<=n;i++) 21 { 22 swap(r[i],r[k]); 23 if(compute(k) < best) 24 search(k+1); 25 swap(r[i],r[k]); 26 } 27 } 28 29 int main() 30 { 31 int i,j; 32 cin>>n; 33 for(i=1;i<=n;i++) 34 for(j=1;j<=n;j++) 35 cin>>tab[i][j]; 36 for(i=1;i<=n;i++) 37 r[i]=i; 38 //best=INT_MAX; 39 search(1); 40 cout<<best<<endl; 41 return 0; 42 }