法一:dfs
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> temp,v,res;
int n,m;
bool flag=false;
void dfs(int index,int target){
if(target==0){
res=temp;
flag=true;
return;
}else if(target<0){
temp.pop_back();
return;
}
for(int i=index;i<v.size()&&!flag;i++){
temp.push_back(v[i]);
dfs(i+1,target-v[i]);
}
temp.pop_back();
return;
}
int main(){
cin>>n>>m;
v.resize(n);
for(int i=0;i<n;i++) cin>>v[i];
sort(v.begin(),v.end());
dfs(0,m);
if(!res.size()) cout<<"No Solution"<<endl;
else{
for(int i=0;i<res.size();i++){
if(i) cout<<" ";
cout<<res[i];
}
}
}
法二:动规
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> dp(110),v(10010);
bool choice[10010][110]={false};
int cmp(int &a,int &b){
return a>b;
}
int main(){
int num,target;
cin>>num>>target;
for(int i=0;i<num;i++) cin>>v[i];
sort(v.begin(),v.end(),cmp);
for(int i=0;i<num;i++)
for(int j=target;j>=v[i];j--)
if(dp[j]<=dp[j-v[i]]+v[i]){
dp[j]=dp[j-v[i]]+v[i];
choice[i][j]=true;
}
if(dp[target]!=target) cout<<"No Solution";
else{
vector<int> ans;
int i=num-1,j=target;
while(j>0){
if(choice[i][j]){
ans.push_back(v[i]);
j-=v[i];
}
i--;
}
for(int i=0;i<ans.size();i++){
if(i) cout<<" ";
cout<<ans[i];
}
}
}