题目举例:从N个整数中选择K个数,使这K个数的和为X,并找到它们中元素的平方和最大的一个方案:例如从{2,3,3,4}中找2个数使其和为6,最佳方案应为{2,4}。
使用DFS方法代码如下:
#include <iostream>
#include <vector>
using namespace std;
int num[100];
int n, k, x, maxsq;
vector<int> vec, best;
void DFS(int index, int nowk, int sum, int sumsq)
{
if(nowk == k && sum == x)
{
if(sumsq>maxsq)
{
maxsq = sumsq;
best = vec;
}
return;
}
if(index==n || nowk==k ||sum>x)
return;
vec.push_back(num[index]);
DFS(index+1, nowk+1, sum+num[index], sumsq+num[index]*num[index]);
vec.pop_back();
DFS(index+1, nowk, sum, sumsq);
}
int main(void)
{
cin>>n>>k>>x;
for(int i=0; i<n; i++)
cin>>num[i];
DFS(0,0,0,0);
cout<<maxsq<<endl;
for(int i=0; i<best.size(); i++)
cout<<best[i]<<' ';
return 0;
}
至于解析,等考研结束后再说吧~~~