码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-10-28 11:40:08      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   os   ar   for   sp   

真的是蛮好的一题~

里面的第二层循环 小变量 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的体积所能得到的最大价值

好了 上代码

bubuko.com,布布扣
 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:

  该认真的时候

  认真点

  认真是种情怀

 

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

标签:style   blog   http   io   color   os   ar   for   sp   

原文地址:http://www.cnblogs.com/radical/p/4056132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!