题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1115
题意:n个军舰,m个海岸线,各个长度给出,求n个军舰怎么组成这些海岸线。
思路很简单,就是深搜,好吧,我WA了很多次在test10,错的地方是在回溯,我在处理回溯的时候,只考虑了一条海岸线的回溯,要是下个海岸线结果不能成功了,就要回溯到前一个海岸线,而我直接输出了。
解决办法: 就是把每一个军舰插入后深搜,这里有个要注意的地方是,一碰到结果,直接退出所有栈,exit(0),这样就解决了拆前一根海岸线。
两个代码都附到下面。
/* #include <bits/stdc++.h> using namespace std; int n,m; int dist[105]; int vis[105]; int ans[15]; int t; int cnt; bool dfs(int k,int ans) { if(k>=ans) return true; for(int i=0; i<n; i++) { if(vis[i]==false&&(k+dist[i])<=ans) { cnt++; vis[i] = t; if(dfs(k+dist[i],ans)==true) return true; vis[i] = 0; --cnt; } } return false; } bool cmp(int a,int b) { return a>b; } int main() { scanf("%d%d",&n,&m); for(int i=0; i<n; i++) scanf("%d",&dist[i]); sort(dist,dist+n); for(int i=0; i<m; i++) scanf("%d",&ans[i]); t = 1; for(int i=0; i<m; i++) { cnt = 0; if(dfs(0,ans[i])) { printf("%d ",cnt); for(int i=0; i<n; i++) if(vis[i]==t) { printf("%d ",dist[i]); } puts(""); t++; } } return 0; } */
#include <bits/stdc++.h> using namespace std; int a[105],len[15]; bool vis[105]; vector<int> ans[15]; int n,m; void dfs(int x) { if(x==m) { for(int i=0; i<m; i++) { printf("%d ",ans[i].size()); for(int j=0; j<ans[i].size();j++) printf("%d ",ans[i][j]); puts(""); } exit(0); } for(int i=n-1; i>=0; i--) { if(!vis[i]&&a[i]<=len[x]) { len[x] -= a[i]; vis[i] = 1; ans[x].push_back(a[i]); if(!len[x]) dfs(x+1); else dfs(x); len[x] +=a[i]; vis[i] = 0; ans[x].pop_back(); } } } int main() { scanf("%d%d",&n,&m); for(int i=0; i<n; i++) scanf("%d",&a[i]); sort(a,a+n); for(int i=0; i<m; i++) scanf("%d",&len[i]); dfs(0); return 0; }