挑战编程--初级篇:部分和问题(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; }
时间: 2024-10-24 09:19:07