给定整数a1,a2,a3,...,an,判断是否可以从中
选出若干输使得它们的和恰好为k第一行输入n代表几个数字
第二行输入数字
第三行输入结果
样例:
4
1 2 4 7
13
yes
这是一道基础题,对于初学者而言使用两重循环无疑是最便捷的
#include<iostream>
#include<vector>
using namespace std;
int main(void)
{
int n,k,a1,sum=0;
int flog=0;
vector<int>a;
cin>>n;//数据输入
for(int i=0;i<n;i++)
{
cin>>a1;
a.push_back(a1);
}
cin>>k;
for(int i=0;i<n;i++)//遍历求和
{
for(int j=i;j<n;j++)
{
sum=sum+a[j];
if(sum == k)
{
cout<<"yes";
flog=1;
}
}
sum=0;
}
if(flog==0)
cout<<"no";
return 0;
}
同时我们也可以使用深度优先搜索方法(DFS)
#include<iostream>
using namespace std;
int n,k;
int a[100];
bool def(int i,int sum)
{
if(i == n)
{
return sum == k;
}
//左子树,选中情况
if(def(i+1,sum+a[i]))
{
return true;
}
//右子树,选中情况
if(def(i+1,sum))
{
return true;
}
return false;
}
int main(void)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
cin>>k;
if(def(0,0))
{
cout<<"yes";
}
else{
cout<<"no";
}
return 0;
}