首页 > 代码库 > 搜索学习(3)--NYOJ1058--部分和问题

搜索学习(3)--NYOJ1058--部分和问题

挑战编程--初级篇:部分和问题(P30)

代码实现:

//部分和问题:
int a[maxn];
int n,m,i,j,k;
bool dfs(int i,int sum)     //已经从前i项得到了和sum,然后对于i项之后的进行分支
{
    if(i==n) return sum==k; //如果前n项都计算过了,则返回sum是否与k相等
    if(dfs(i+1,sum)) return true;//不加上a[i]的情况
    if(dfs(i+1,sum+a[i])) return true;//加上a[i]的情况
    return false;           //无论是否加上a[i]都不能凑成k就返回false;
}
void solve
{
    if(dfs(0,0)) printf("Yes\n");
    else printf("No\n");
}
拓展,输出路径,例题NYOJ1058  链接:click here

思路:DFS入门,用到了一个减枝

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,k,a[25],sum[25];
bool vis[25],flag;
void dfs(int i, int ssum)
{
    if(i>=0&&!flag)
    {
        if(ssum+sum[i]<k)
        {
            return;
        }
        if (ssum+a[i]<=k)
        {
            vis[i]=true;
            dfs(i-1,ssum+a[i]);
            vis[i]=false;
        }
        dfs(i-1,ssum);
        if (ssum==k&&!flag)
        {
            flag=true;
            cout<<"YES"<<endl;
            for (int i=1;i<=n;i++)
            {
                if (vis[i])
                {
                    cout<<a[i]<<' ';
                }
            }
            cout<<endl;
        }
    }
}
int main()
{
    while(cin>>n>>k)
    {
        flag=false;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            sum[i]=sum[i-1]+a[i];
        }
        dfs(n,0);
        if(!flag)
        {
        cout<<"NO"<<endl;
        }
    }
    return 0;
}


搜索学习(3)--NYOJ1058--部分和问题