• 背包九讲之六(分组背包问题)


     1 /*
     2 有n件物品和一个容量为v的背包,第i件物品的费用是c[i],价值是w[i]
     3 这些物品被分为若干组,每组中的物品互相冲突,即一组中只能取一件物品
     4 将哪些物品装入背包使得总价值最大
     5 dp[k][v] 表示前k组物品花费容量v能取到的最大值
     6 dp[k][v] = max(dp[k-1][v],dp[k-1][v-c[i]]+w[i])//物品i属于第k组
     7 for(i=1; i<=k; ++i)
     8     for(j=v;j>=0; ++j)
     9         for(所有的l属于组k)
    10             if(j>=c[i])
    11                 dp[i][j] = max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]);
    12 
    13 要注意for(j=v;j>=0; ++j)一定要在循环for(所有的l属于组k)之外
    14 这两个循环的意义是对于每个容量j,取组k内的哪个物品更能得到最大价值
    15 同样可以压缩为一维的状态
    16 for(i=1; i<=k; ++i)
    17     for(j=v;j>=0; ++j)
    18         for(所有的l属于组k)
    19             if(j>=c[i])
    20                 dp[j] = max(dp[j],dp[j-c[i]]+w[i]);
    21 
    22 题目:http://acm.hdu.edu.cn/showproblem.php?pid=1712
    23 题意:给定n门课和m天,和一个数组a[i][j],(1<=i<=n,1<=j<=m)
    24 表示在第i门课花费j天的收益,可知n门课即n组,组内为对第i门课花费1-->m天
    25 收益,即组内只能取一个数据。所以是分组背包问题
    26 */
    27 #include <stdio.h>
    28 #include <string.h>
    29 const int N = 111;
    30 int dp[N],a[N][N];
    31 int n,m;
    32 inline int max(const int &a, const int &b)
    33 {
    34     return a < b ? b : a;
    35 }
    36 int main()
    37 {
    38     int i,j,k;
    39     while(scanf("%d%d",&n,&m)!=EOF)
    40     {
    41         if(n==0 && m==0) break;
    42         memset(dp,0,sizeof(dp));
    43         for(i=1; i<=n; ++i)
    44             for(j=1; j<=m; ++j)
    45                 scanf("%d",&a[i][j]);
    46         for(i=1; i<=n; ++i)
    47             for(j=m; j>=0; --j)
    48                 for(k=1; k<=j; ++k)
    49                 {
    50                     dp[j] = max(dp[j],dp[j-k]+a[i][k]);
    51                 }
    52         printf("%d
    ",dp[m]);
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    爱福窝在线装修设计软件测评
    关于简书首页模式的思考和畅想
    这些O2O比你们更靠谱儿
    iOS动画——Layer Animations
    最大流, 最小割问题及算法实现
    浅谈iOS学习之路
    iOS架构师之路:慎用继承
    iOS架构师之路:控制器(View Controller)瘦身设计
    IOS中的编码规范
    关闭键盘导致tableView:didSelectRowAtIndexPath:失效解决办法
  • 原文地址:https://www.cnblogs.com/justPassBy/p/4279691.html
Copyright © 2020-2023  润新知