方法:动态规划。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N,pay;
vector<int> dp[102];
bool judge(vector<int> a,vector<int> b){
sort(a.begin(),a.end());
sort(b.begin(),b.end());
int lena=a.size(),lenb=b.size();
for(int i=0;i<lena&&i<lenb;i++){
if(a[i]>b[i]) return true; //a比b大,则b替换a
else if(a[i]<b[i]) return false; //a比b小,则b不能替换a
}
return true;
}
int main(){
scanf("%d%d",&N,&pay);
int temp;
for(int i=0;i<N;i++){
scanf("%d",&temp);
if(temp>pay) continue; //面值超过需要支付的额度,则直接跳过
for(int i=1;i<pay;i++){ //注意从小到大, 顺序很重要
if(dp[i].size()==0||i-temp<0) continue;
dp[i].push_back(temp);
if(judge(dp[i-temp],dp[i])) dp[i-temp]=dp[i];
dp[i].pop_back();
}
dp[pay].push_back(temp);
if(judge(dp[pay-temp],dp[pay])){
dp[pay-temp]=dp[pay];
}
dp[pay].clear();
}
if(dp[0].size()==0) printf("No Solution");
else{
sort(dp[0].begin(),dp[0].end());
for(int i=0;i<dp[0].size()-1;i++)
printf("%d ",dp[0][i]);
printf("%d",dp[0][dp[0].size()-1]);
}
return 0;
}