真的是蛮好的一题~
里面的第二层循环 小变量 i j k分别从哪里开始 哪里结束 逆序 还是 顺序 都要好好地去体会
我自己讲不来 至于为什么V是逆序 你可以将它当成某种特殊的01背包来看待 就很容易想了
其实 第3层循环
1 for( int k = 1 ; k<=m ; k++ ) 2 { 3 if( j>=k ) 4 { 5 dp[j] = max( dp[j] , dp[j-k]+a[i][k-1] ); 6 } 7 }
这里的 if( j>=k )因为是K就代表了天数 这是很巧合情况不用开数组 一般的话 要开个vol[ k ]数组
这边的话 也是有 滚动数组的压缩空间概念在的
不然的话 是开个二维dp[i][j] i就代表到了第I组物品 J代表前I组所占用的体积 DP数组就代表前I组占用J的体积所能得到的最大价值
好了 上代码
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 const int size = 110; 7 int a[size][size]; 8 int dp[size]; 9 10 int main() 11 { 12 cin.sync_with_stdio(false); 13 int t , n , m; 14 while( cin >> n >> m && (n||m) ) 15 { 16 for( int i = 0 ; i<n ; i++ ) 17 { 18 for( int j = 0 ; j<m ; j++ ) 19 { 20 cin >> a[i][j]; 21 } 22 //a[i][m] = 0; 23 } 24 memset( dp , 0 , sizeof(dp) ); 25 for( int i = 0 ; i<n ; i++ ) 26 { 27 for( int j = m ; j>=1 ; j-- ) 28 { 29 for( int k = 1 ; k<=m ; k++ ) 30 { 31 if( j>=k ) 32 { 33 dp[j] = max( dp[j] , dp[j-k]+a[i][k-1] ); 34 } 35 } 36 } 37 } 38 cout << dp[m] << endl; 39 } 40 return 0; 41 }
today:
该认真的时候
认真点
认真是种情怀