#include <iostream>
#include <string>
#include<algorithm>
#include<bits/stdc++.h>
#include<stack>
#include<set>
#include <vector>
#include <map>
#include<queue>
#include<deque>
#include<cctype>
#include<unordered_set>
#include<unordered_map>
#include<fstream>
using namespace std;
int n,v,maxvalue=0;//此时要定义全局变量,因为在Dfs调用的时候需要使用
const int maxn=21;
int w[maxn],c[maxn];
void Dfs(int index,int sumw,int sumc){
if(index==n){//如果index==n,意思是全都选完了
if(sumw<=v&&sumc>maxvalue){//判断是否满足条件以及是否是最大的maxvalue
maxvalue=sumc;
}
return ;
}
Dfs(index+1,sumw+w[index],sumc+c[index]);//选该物品 ,index加一,重量和价值都加上该物品
Dfs(index+1,sumw,sumc);//不选该物品 ,只让index加
}
int main(){
cin>>n>>v;//输入n与v
for(int i=0;i<n;i++){
cin>>w[i];
}
for(int i=0;i<n;i++){
cin>>c[i];
}
Dfs(0,0,0);//从第0个物品开始,重量是0,价值是0
cout<<maxvalue;
}
#include <iostream>
#include <string>
#include<algorithm>
#include<bits/stdc++.h>
#include<stack>
#include<set>
#include <vector>
#include <map>
#include<queue>
#include<deque>
#include<cctype>
#include<unordered_set>
#include<unordered_map>
#include<fstream>
using namespace std;
int n,k,x,nowk,maxpf=0,sumx=0,maxnow;
const int maxn=1001;
int a[maxn];
vector<int>temp,ans;
void Dfs(int index,int nowk,int sumx,int maxnow){
if(nowk==k&&sumx==x){//如果此时满足条件,找到了
if(maxnow>maxpf){//判断是不是最优解
maxpf=maxnow;//是最优解赋值
temp=ans;//记录最优解的值
}
return ;
}
if(index==n||nowk>k||sumx>x) return ;//不满足条件,直接返回
//选择
ans.push_back(a[index]);//选择,将该数放入数组
Dfs(index+1,nowk+1,sumx+a[index],maxnow+a[index]*a[index]);//选择该数,index加一,nowk加1,等
ans.pop_back();//没选上,放出
//不选择
Dfs(index+1,nowk,sumx,maxnow);
}
int main(){
cin>>n>>k>>x;
for(int i=0;i<n;i++){
cin>>a[i];
}
Dfs(0,0,0,0);//第0个数,此时k=0,sumx=0,最大也为0
for(int i=0;i<temp.size();i++){
cout<<temp[i]<<" ";
}
cout<<endl<<maxpf;
}
如果每个数可以多次选择,那么只需要修改一个语句
Dfs(index,nowk+1,sumx+a[index],maxnow+a[index]*a[index]);//这里index不加一,继续用该数