#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 10010,maxv=110;
int w[maxn], dp[maxv] = { 0 };
bool choice[maxn][maxv] = { 0 }, flag[maxn] = { 0 };
bool cmp(int a, int b){ return a > b;}
int n, m;
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &w[i]);
sort(w+1, w + n+1, cmp);//注意一下范围
for (int i = 1; i <= n; i++)
{
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;
}
else choice[i][v] = 0;
}
}
if (dp[m] != m)
{
printf("No Solution");
return 0;
}
int v = m,num=0;
for (int i = n; i >= 0; i--)
{
if (choice[i][v] == 1)
{
flag[i] = 1;
v -= w[i];
num++;
}
else flag[i] = 0;
}
for (int i = n; i >= 1; i--)
{
if (flag[i] == 1)
{
printf("%d", w[i]);
num--;
if (num != 0) printf(" ");
}
}
return 0;
}
A1068 Find More Coins (30 分)01背包问题
最新推荐文章于 2020-03-24 01:49:38 发布