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]);