部分和问题
Posted si-wuxie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部分和问题相关的知识,希望对你有一定的参考价值。
题目描述:
给定整数a1,a2....an,判断是否可以从中选出若干数,使它们的和恰好为k.
限制条件
1≤n≤20
-10^8 ≤ ai ≤ 10^8
-10^8 ≤ k ≤ 10^8
样例1
输入:
n=4
a={1,2,4,7}
k=13
输出
Yes
样例2
输入:
n=4
a={1,2,4,7}
k=15
输出
No
分析:从a1开始按顺序决定每个数加或不加,在全部n个数都决定后再判断它们的和是不是k即可。
代码如下:
1 #include<iostream> 2 using namespace std; 3 4 #define MAX_N 20 5 int a[MAX_N]; 6 int n,k; 7 8 bool dfs(int i,int sum)//已经从前i项得到了和sum,然后对于i项之后的进行判断 9 { 10 if(i==n)//如果前i项都计算过了,则返回sum是否与k相等 11 { 12 return sum==k; 13 } 14 if(dfs(i+1,sum))//不加上a[i]的情况 15 { 16 return true; 17 } 18 if(dfs(i+1,sum+a[i])) //加上a[i]的情况 19 { 20 return true; 21 } 22 return false; 23 } 24 int main(){ 25 26 cin>>n; 27 for(int i=0; i<n; i++) 28 { 29 cin>>a[i]; 30 } 31 cin>>k; 32 if(dfs(0,0)) 33 { 34 cout<<"Yes"; 35 } 36 else 37 { 38 cout<<"No"; 39 } 40 return 0; 41 }
以上是关于部分和问题的主要内容,如果未能解决你的问题,请参考以下文章