挑战编程--初级篇:部分和问题(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;
}