UVA 264 CD
典型的01背包+要求输出路径,选的何种背包。新东西:输出路径
#include <cstdio>
#include <cstdlib>
#include <cstring>
const int MAXN = 10010;
int dp[MAXN];
int time[25];
bool f[25][MAXN];
int main()
{
int w, n;
while (scanf("%d", &w) != EOF)
{
scanf("%d", &n);
memset(dp, 0, sizeof(dp));
memset(f, false, sizeof(f));
for (int i = 1; i <= n; ++i)
scanf("%d", &time[i]);
for (int i = n; i >= 1; --i)
for (int v = w; v >= time[i]; --v)
if (dp[v] < dp[v-time[i]] + time[i])
dp[v] = dp[v-time[i]] + time[i], f[i][v] = true; //放入物品时f[i][v]记为真
for (int i = 1, j = w; i <= n; ++i) //输出路径
if (f[i][j])
printf("%d ", time[i]), j -= time[i];
printf("sum:%d\n", dp[w]);
}
return 0;
}