本网页所有文字内容由 imapbox邮箱云存储,邮箱网盘, iurlBox网页地址收藏管理器 下载并得到。
ImapBox 邮箱网盘 工具地址: https://www.imapbox.com/download/ImapBox.5.5.1_Build20141205_CHS_Bit32.exe
PC6下载站地址:PC6下载站分流下载
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox 网页视频 工具地址: https://www.imapbox.com/download/ImovieBox4.7.0_Build20141115_CHS.exe
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
 
 
 
 
 问题 分组的背包问题将彼此互斥的若干物品称为一个组,这建立了一个很好的模型。不少背包问题的变形都可以转化为分组的背包问题(例如P07),由分组的背包问题进一步可定义“泛化物品”的概念,十分有利于解题。 (以上摘自背包九讲) https://acm.hdu.edu.cn/showproblem.php?pid=1712  
 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
 算法
 这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有:
 f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于组k}
 使用一维数组的伪代码如下:
 for 所有的组k
     for v=V..0
         for 所有的i属于组k
             f[v]=max{f[v],f[v-c[i]]+w[i]}
 注意这里的三层循环的顺序,甚至在本文的第一个beta版中我自己都写错了。“for v=V..0”这一层循环必须在“for 所有的i属于组k”之外。这样才能保证每一组内的物品最多只有一个会被添加到背包中。
 另外,显然可以对每组内的物品应用P02中“一个简单有效的优化”。
 小结
#include <stdio.h> #include <iostream> #include <algorithm> #include <math.h> #include <string.h> using namespace std;  int a[105][105],dp[105]; int n,m;  int main() {     while(~scanf("%d%d",&n,&m))     {         if(n==0&&m==0)         break;         for(int i=1;i<=n;i++)         {             for(int j=1;j<=m;j++)                  scanf("%d",&a[i][j]);         }         memset(dp,0,sizeof(dp));         for(int i=1;i<=n;i++)         {             for(int j=m;j>=0;j--)             {                 for(int k=1;k<=j;k++)                 {                     dp[j]=max(dp[j],dp[j-k]+a[i][k]);                 }             }         }         printf("%d/n",dp[m]);     }     return 0; } 
阅读和此文章类似的: 程序员专区
 官方软件产品操作指南 (170)
官方软件产品操作指南 (170)