hdu 3496 二维费用的01背包

算是比较简单的二维费用背包了吧,注意在某一维上要求“装满”。

另外:对于多维费用的背包,最内层的循环可以逆着写,想一想,为什么。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 using namespace std;
 6 
 7 const int INF = -99999999;
 8 const int N = 101;
 9 const int L = 1001;
10 int dp[N][L];
11 int n, m, l;
12 
13 void init()
14 {
15     memset( dp, -1, sizeof(dp) );
16     for ( int j = 0; j < L; j++ )
17     {
18         dp[0][j] = 0;
19     }
20 }
21 
22 int main ()
23 {
24     int t;
25     scanf("%d", &t);
26     while ( t-- )
27     {
28         scanf("%d%d%d", &n, &m, &l);
29         init();
30         for ( int i = 1; i <= n; i++ )
31         {
32             int time, value;
33             scanf("%d%d", &time, &value);
34             for ( int j = m; j > 0; j-- )
35             {
36                 for ( int k = l; k >= time; k-- )
37                 {
38                     if ( dp[j - 1][k - time] != -1 )
39                     {
40                         dp[j][k] = max( dp[j][k], dp[j - 1][k - time] + value );
41                     }
42                 }
43             }
44         }
45         int ans = dp[m][l] == -1 ? 0 : dp[m][l];
46         printf("%d
", ans);
47     }
48     return 0;
49 }
原文地址:https://www.cnblogs.com/huoxiayu/p/4649338.html