hdu--1712--分组背包<如果你真的明白了背包..>

真的是蛮好的一题~

里面的第二层循环 小变量 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 }
View Code

today:

  该认真的时候

  认真点

  认真是种情怀

just follow your heart
原文地址:https://www.cnblogs.com/radical/p/4056132.html