思路:01背包,用到了滚动数组
提交情况:solution输出时忘记大写
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#define FOR(i, x, y) for(int i = x; i <= y; i++)
#define rFOR(i, x, y) for(int i = x; i >= y; i--)
#define MAX 220
#define oo 0x3f3f3f3f
using namespace std;
char str[1010];
int dp[110];
int choice[10010][110];
int flag[10010];
int w[10010];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
int n,m;
scanf("%d%d",&n,&m);
FOR(i,1,n)
{
scanf("%d",&w[i]);
}
sort(w+1,w+n+1,cmp);
FOR(i,1,n){
for(int v=m;v>=w[i];v--)
{
if(dp[v]<=dp[v-w[i]]+w[i]){
dp[v]=dp[v-w[i]]+w[i];
choice[i][v]=1;
}
}
}
if(dp[m]!=m)printf("No Solution");
else{
int k=n,num=0,v=m;
while(k>=0){
if(choice[k][v]==1){
flag[k]=1;
v-=w[k];
num++;
}
k--;
}
for(int i=n;i>=1;i--){
if(flag[i]){
printf("%d",w[i]);
num--;
if(num>0) printf(" ");
}
}
}
return 0;
}