问题:
在给出的序列中,挑选出是否存在其的和等于给定数字s。
为方便起见,所有数字都为自然数。
分析:
每次递归返回要这数字,或者不要这数字,如果要,则向前递归的求和减去当前数值,否则不减。
代码:
#include <iostream>
using namespace std;
int a[10];
bool dp[10][20]={0}; //表示到当前点处的最大值
bool fun(int n,int s){ //记忆递归
if(dp[n][s]>0){
return dp[n][s];
}
bool ans;
if(s==0)
ans = true;
else if(n==0)
ans= (a[0]==s);
else if(a[n]>s)
ans = fun(n-1,s);
else
ans = (fun(n-1,s)||fun(n-1,s-a[n]));
dp[n][s]=ans;
return ans;
}
int main(){
int n,s;
cin>>n>>s;
for(int i=0;i<n;i++){
cin>>a[i];
}
cout<<fun(n-1,s)<<endl;
return 0;
}
//6 9
//3 34 4 12 5 2