2019年2月3日
10:08
01背包
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[10005][105], flag[10005][105];
int data[10005];
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
int n, m, x;
while(cin >> n >> m)
{
memset(data, 0, sizeof(data));
for(int i = 1; i <= n; i++)
{
cin >> data[i];
}
sort(data + 1, data + n + 1, cmp);
memset(dp, 0, sizeof(dp));
memset(flag, 0, sizeof(flag));
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(j >= data[i] && dp[i - 1][j] <= dp[i - 1][j - data[i]] + data[i])
{
dp[i][j] = dp[i - 1][j - data[i]] + data[i];
flag[i][j] = 1;
}
else
dp[i][j] = dp[i - 1][j];
}
}
if(dp[n][m] != m)
{
cout << "No Solution" << endl;
continue;
}
int f = 1;
for(int i = n; i >= 0 && m; i--)
{
if(flag[i][m] && f)
{
cout << data[i];
m -= data[i];
f = 0;
}
else if(flag[i][m])
{
cout << " " << data[i];
m -= data[i];
}
}
cout<<endl;
}
return 0;
}
/*
8 9
5 9 8 7 2 3 4 1
4 8
7 2 4 3
1 9
9
*/