dfs-部分和問題

標題:部分和問題
給定整數a1,a2,…,an,判斷是否可以從中選出若干數,使他們的和爲k。
限制條件:
1<=n<=20
-1000000000<=ai<=100000000
-1000000000<=k<=100000000
輸入:
n=4
a={1,2,4,7}
k=13
輸出:
yes(13=2+4+7)
輸入:
n=4
a=(1, 2,4,7)
k=15
輸出:
no
代碼

#include <iostream>
#define MAX 20
using namespace std;
int a[MAX];
int n,k;
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; 
}
int main(){
	cin>>n;
	for(int i=0;i<n;++i){
		cin>>a[i];
	}
	cin>>k;
	if(dfs(0,0)){
		cout<<"yes"<<endl;
	}else{
		cout<<"no"<<endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章