标签:
算是比较简单的二维费用背包了吧,注意在某一维上要求“装满”。
另外:对于多维费用的背包,最内层的循环可以逆着写,想一想,为什么。
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\n", ans); 47 } 48 return 0; 49 }
标签:
原文地址:http://www.cnblogs.com/huoxiayu/p/4649338.html