算是比较简单的二维费用背包了吧,注意在某一维上要求“装满”。
另外:对于多维费用的背包,最内层的循环可以逆着写,想一想,为什么。
1 #include2 #include 3 #include 4 #include 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\n", ans);47 }48 return 0;49 }