部分和问题

这一道题有一个条件没有说明  那就是    当有多个符合条件的解 的时候   优先输出后面符合条件的  ..

这一道题最重要的就是那个线性搜索的   复杂度优化  ..  这个优化确实超级给力  

先附上正确的代码 , 这样的代码没有重复的     

#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;
}

 

 

                                                     

 

posted @ 2016-04-05 17:25  X-POWER  阅读(123)  评论(0编辑  收藏  举报