部分和问题
问题描述
给定整数a1,a2,a3,…,an,判断是否可以从中选出若干个数,使它们的和恰好为k。
限制条件
1<=n<=20
-10^ 8<=ai<=10^8
-10^ 8<=k<=10^8
Sample1
Input
n=4
a={1,2,4,7}
k=13
Output
Yes {13=2+4+7}
Sample2
Input
n=4
a={1,2,4,7}
k=15
Output
No
模型分析:是将选取一串数字求和,那么就是统计深度,使用深度优先搜索。
模型处理:按输入顺序处理这些数字,只需取舍每个数字是加还是不加.
代码
//输入处理后
int a[MAX_N];
int n,k;
//已经从前i项得到了和num,然后对于i项之后的进行分支
bool dfs(int i,int sum){
//如果前n项都计算过了,则返回sum是否与k相等
if(i==n) return sum==k;
//不加上a[i]的情况
if(dfs(i+1,sum)) return true;
//加上a[i]的情况
if(dfs(i+1,sum+a[i])) return true;
//无论是否加上a[i]都不能凑成k就返回false
return false;
}
void solve(){
if(dfs(0,0)) cout<<"Yes\n";
else cout<<"No\n";
}