题目地址:http://www.51cpc.com/web/problem.php?id=4264
Summarize:
其实一看到这道题我就想到了01背包,但是卡死在了如何顺序输出,哎。回溯么,我只会写递归的,非递归的早忘了。。后续补充;
搜索:
1. 注意特判所有元素加起来都小于C;
2. 递归内循环从0开始,由于vis不必担心重复;但题目要求顺序输出,故应从第一个开始;
附搜索代码:
1 #include<iostream> 2 #include<cstring> 3 #define inf 1e9 4 typedef long long LL; 5 using namespace std; 6 7 const int N = 7e3+5; 8 LL n,c; 9 LL a[N], vis[N], can; 10 11 void dfs(int i, LL sum) 12 { 13 if(can || i>=n) return; 14 15 if(sum == c) 16 { 17 can=1; 18 int i=0; 19 while(!vis[i] && i<n) i++; 20 cout<<a[i]; 21 for(i++; i<n; i++) 22 if(vis[i]) cout<<' '<<a[i]; 23 cout<<endl; 24 return; 25 } 26 27 for(int k=0; k<n; k++) { 28 if(sum+a[k]<=c && !vis[k]) { 29 vis[k] = 1; 30 dfs(k, sum+a[k]); 31 vis[k] = 0; 32 } 33 } 34 } 35 36 int main() 37 { 38 ios::sync_with_stdio(false); 39 40 while(cin>>n>>c) 41 { 42 can=0; 43 LL sum=0; 44 for(int i=0; i<n; i++) { 45 cin>>a[i], vis[i]=0; 46 sum += a[i]; 47 } 48 if(sum < c) { 49 cout<<"No Solution!"<<endl; 50 continue; 51 } 52 dfs(0,0); 53 if(!can) cout<<"No Solution!"<<endl; 54 } 55 }