0-1背包问题。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int size = 20 + 2;
const int n_size = 20000;
int c[size];
int d[n_size][size] , f[n_size][size];
void output(int n , int m)
{
if(f[n][m] == -1) return;
output(f[n][m] , m-1);
if(f[n][m] != n) printf("%d " , n - f[n][m]);
}
int main()
{
int n , m;
while(scanf("%d%d" , &n , &m) == 2)
{
for(int i = 1 ; i <= m ; ++i) scanf("%d" , c +i);
memset(d , 0 , sizeof(d));
memset(f , -1 , sizeof(f));
for(int i = 1 ; i <= m ; ++i)
{
for(int j = 0 ; j <= n ; ++j)
{
if(j >= c[i])
{
int t = d[j-c[i]][i-1] + c[i];
if(d[j][i-1] < t)
{
d[j][i] = t;
f[j][i] = j - c[i];
}
else
{
d[j][i] = d[j][i-1];
f[j][i] = j;
}
}
else { d[j][i] = d[j][i-1]; f[j][i] = j; }
}
}
output(n , m);
printf("sum:%d\n" , d[n][m]);
}
return 0;
}