http://www.rqnoj.cn/Problem_6.html
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int MAXN = 32100; const int MAXM = 65; int f[MAXM][MAXN]; int c[MAXM][3], w[MAXM][3]; int n, m; void Pack() { int i, j; for( i = 1; i <= m; i ++) for( int j = 0; j <= n; j ++) { f[i][j] = f[i - 1][j]; int c1 = c[i][0], c2 = c[i][0] + c[i][1]; int c3 = c[i][0] + c[i][2], c4 = c[i][0] + c[i][1] + c[i][2]; int w1 = w[i][0], w2 = w[i][0] + w[i][1]; int w3 = w[i][0] + w[i][2], w4 = w[i][0] + w[i][1] + w[i][2]; if( j >= c1) f[i][j] = max( f[i][j], f[i - 1][j - c1] + w1); if( j >= c2) f[i][j] = max( f[i][j], f[i - 1][j - c2] + w2); if( j >= c3) f[i][j] = max( f[i][j], f[i - 1][j - c3] + w3); if( j >= c4) f[i][j] = max( f[i][j], f[i - 1][j - c4] + w4); } } int main() { int i, v, p, q; while( scanf( "%d%d", &n, &m) == 2) { memset( f, 0, sizeof f); memset( w, 0, sizeof w); memset( c, 0, sizeof c); for( i = 1; i <= m; i ++) { scanf( "%d%d%d", &v, &p, &q); if( q == 0) { c[i][0] = v, w[i][0] = p * v; } else if( c[q][1] == 0 ){ c[q][1] = v, w[q][1] = p * v; } else { c[q][2] = v, w[q][2] = p * v; } } Pack(); printf( "%d\n", f[m][n]); } return 0; }