背包九讲之六(分组背包问题)
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\n",dp[m]); 53 } 54 return 0; 55 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探