1.数的划分 2星 https://ac.nowcoder.com/acm/problem/16695 1 #includebits/stdc++.h 2 using namespace std; 3 #define ll long long 4 #define eps 1e-6 5 int ans= 0 ; 6 int n, k; 7 void dfs( int id, int sum, int val) 8 { 9 /* if(id == k-1 su
1.数的划分 2星
https://ac.nowcoder.com/acm/problem/16695
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define eps 1e-6 5 int ans=0; 6 int n, k; 7 void dfs(int id, int sum, int val) 8 { 9 /*if(id == k-1 && sum + val <= n){ //存在最后一个数字n-sum>=val 集合里面的数字是递增的 10 ans++; 11 return; 12 } 13 for(int i = val; i <= n; i++){ 14 if(sum + i >n) 15 break; 16 dfs( id + 1, sum + i, i); 17 }*/ 18 if(id==k&&sum==n) 19 { 20 ans++; 21 return; 22 } 23 24 if(id>=k||sum>n) 25 return; 26 27 for(int i = val; i <= n; i++){ 28 if(sum+i>n) 29 break; 30 dfs(id+1,sum+i,i); 31 } 32 } 33 34 int main() 35 { 36 while(scanf("%d %d", &n, &k) != EOF){ 37 ans = 0; 38 dfs(0, 0, 1); 39 printf("%d\n", ans); 40 } 41 return 0; 42 }View Code
2.单词接龙 3星
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 struct node{ 5 char s[22]; 6 int len; 7 int v;//被选的次数 8 }c[22]; 9 int n,maxn; 10 11 void dfs(int x,int len){//当前单词序号 目前龙的长度 12 for(int i=1;i<=n;i++){ //可以选n种单词 13 if(c[i].v<2)//被选的次数小于2 14 { 15 for(int j=0;j<c[x].len;j++){ //判断前一个单词是否和当前所选的单词有相等的地方 16 if(c[x].s[j]==c[i].s[0]){ 17 int k=1,t=1,l; 18 for(l=j+1;l<c[x].len&&k<c[i].len;++k,++l){ 19 if(c[x].s[l]!=c[i].s[k]) 20 { 21 t=0; break; 22 } 23 } 24 if(l!=c[x].len) //说明单词i被单词x包含 25 t=0; 26 if(t) //说明单词x与单词i相连且不被包含 27 { 28 c[i].v++; 29 dfs(i,len+c[i].len-k); 30 c[i].v--; 31 } 32 } 33 } 34 } 35 } 36 maxn=max(maxn,len); 37 } 38 39 int main(){ 40 cin>>n;//单词数 41 for(int i=1;i<=n;i++){ 42 cin>>c[i].s;//第一个单词内容 43 c[i].len=strlen(c[i].s);//第一个单词长度 44 } 45 cin>>c[0].s;//成语接龙首字母 46 c[0].len=strlen(c[0].s); 47 48 dfs(0,c[0].len); 49 cout<<maxn<<endl; 50 }View Code
使用dfs的情况:搜索值最大的方案 方案由几个x组成,x又有n种方案,对x进行dfs void dfs(int x) { for(int i=0;i<n;i++) ... }