部分和问题
这一道题有一个条件没有说明 那就是 当有多个符合条件的解 的时候 优先输出后面符合条件的 ..
这一道题最重要的就是那个线性搜索的 复杂度优化 .. 这个优化确实超级给力
先附上正确的代码 , 这样的代码没有重复的
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<set> #include<stack> #include<string> #include<sstream> #include<map> #include<cctype> using namespace std; int a[25],b[25],n,sum,q,s[25]; bool DFS(int i,int m) { if(i==n) return sum==m; else if(sum<m||m+s[n]-s[i]<sum) //这里是一个 极好的优化 能极大的减少所用的时间 可以用于以后的 线性搜索 , 如果可以用这个的话 几乎是 无往不利呀 ! return false; if(DFS(i+1,m)) return true; if(DFS(i+1,a[i]+m)) // 把这个放在后面的 就是 首先输出 后面 符合条件的 . { b[q++]=a[i]; return true; } return false; } int main() { while(scanf("%d%d",&n,&sum)!=EOF) { q=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); s[i+1]=s[i]+a[i]; } if(DFS(0,0)) { printf("YES\n"); for(int i=q-1;i>0;i--) printf("%d ",b[i]); printf("%d\n",b[0]); } else printf("NO\n"); } return 0; }