https://www.patest.cn/contests/gplt/L3-001
dp记录路径题
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <functional>
using namespace std;
const int MAXN = 10005;
int dp[MAXN][105];
int val[MAXN];
int main()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
int N, M;
while (cin >> N >> M)
{
for (int i = 0; i < N; ++i)
cin >> val[i];
sort(val, val + N, greater<int>());
for (int i = 0; i <= M; ++i)
dp[0][i] = val[0] > i ? 0 : val[0];
for (int i = 1; i < N; ++i)
{
for (int v = M; v >= val[i]; --v)
dp[i][v] = max(dp[i - 1][v], dp[i - 1][v - val[i]] + val[i]);
}
/*for (int i = 0; i < N; ++i)
{
for (int j = 1; j <= M; ++j)
cout << dp[i][j] << " ";
cout << " val == " << val[i] << endl;
}*/
if (dp[N - 1][M] != M)
{
cout << "No Solution" << endl;
continue;
}
int i = N - 1;
int v = M;
bool flag = false;
while (i > 0 && v > 0)
{
if (dp[i - 1][v - val[i]] + val[i] == dp[i][v])
{
if (!flag)
flag = true;
else
cout << " ";
cout << val[i];
v -= val[i];
}
--i;
}
if (v > 0)
{
if (!flag)
flag = true;
else
cout << " ";
cout << v;
}
cout << endl;
}
return 0;
}