首页 > 代码库 > 搜索学习(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--部分和问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。