题目:
给定N个整数(可能有负数),从中选择k个数,使这k个数之和恰好等于一个给定的整数x;
如果每个整数不可以多选则有(0-1背包问题):
//递归函数的两个概念,递归边界和递归式;
void DFS(int index,int nowk,int sum,int sumfac){
if(nowk==k&&sum==n){//递归边界
if(sumfac>maxfac){
ans=temp;
maxfac=sumfac;
}
return ;
}
if(nowk>k||sum>n)return ;
temp.push_back(fac[index]);
DFS(index-1,nowk+1,sum+fac[index],sumfac+index);//递归式
temp.pop_back();
DFS(index-1,now,sum,sumfac);
}
如果每个整数可以多选:(完全背包问题)
如PAT甲级1103:ProblemSet Problem - 1103 Integer Factorization (pintia.cn)
模板:
void DFS(int index,int nowk,int sum,int sumfac){
if(nowk==k&&sum==n){
if(sumfac>maxfac){
ans=temp;
maxfac=sumfac;
}
return ;
}
if(nowk>k||sum>n)return ;
temp.push_back(fac[index]);
DFS(index,nowk,sum+fac[index],sumfac+index);//再次选择index进行判断;
temp.pop_back();
DFS(index-1,now,sum,sumfac);
}