N个整数选k个使其和为x,若有多个方案,选择元素平方和最大的一个

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
#define MAX 100010

using namespace std;
int n,k,x,maxSumSq=-1,A[MAX];
//temp存放临时方案,ans存放平方和最大的方案
vector<int> temp,ans;
//当前处理index号整数,当前已选整数个数nowK
//当前已选整数和sum,当前已选整数平方和sumSq
void DFS(int index,int nowK,int sum,int sumSq){
    if(nowK==k && sum==x){
        if(sumSq>maxSumSq){
            maxSumSq=sumSq;
            ans=temp;
        }
        return;
    }
    if(index==n || nowK>k ||sum>x) return;
    temp.push_back(A[index]);
    //选index号数
    DFS(index+1,nowK+1,sum+A[index],sumSq+A[index]*A[index]);
    temp.pop_back();
    //不选index号数
    DFS(index+1,nowK,sum,sumSq);
}
int main(){
    scanf("%d%d%d",&n,&k,&x);
    for(int i=0;i<n;i++)
        scanf("%d",&A[i]);

    DFS(0,0,0,0);
    for(int i=0;i<k;i++)
        printf("%d ",ans[i]);
    return 0;
}

若是改为:

N个数中选k个,且每个可选多次,只需改为

DFS(index,nowK+1,sum+A[index],sumSq+A[index]*A[index]);
posted on 2018-04-05 18:34  Sunshine&暖阳  阅读(247)  评论(0编辑  收藏  举报