博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分组背包问题
阅读量:6734 次
发布时间:2019-06-25

本文共 989 字,大约阅读时间需要 3 分钟。

分组背包其实也不难,弄清楚前面的这里就十分好解决了

有容积为V的背包,有n件物品,每种物品属于的组别不同,t为最大的组数,每组中的物品相互冲突,所以只能选其中一件

接下来是每件物品的重量w[i],价值v[i],以及组号x,求最大的价值

因为每组物品只能选一件,我们很容易把这转化为01背包

显然dp方程为

dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[k]]+v[k])   (k属于第i组)

方程的意义是选择了前i组,用了容积为j的空间所能获取的最大价值

把它转化为一维的便可以得到

dp[j]=max(dp[j],dp[j-w[k]]+v[k])    (k属于第i组)

这样问题就解决了

贴上代码

#include 
#include
#include
#include
using namespace std;const int N=500;vector < int > g[N];int n,V,t,w[N],v[N],x,dp[N];int main(){ scanf("%d %d %d",&V,&n,&t); for(int i=1;i<=n;i++) { scanf("%d %d %d",&w[i],&v[i],&x); g[x].push_back(i); } for(int i=1;i<=t;i++) { for(int j=V;j>=0;j--) { for(int k=0;k
=0) { dp[j]=max(dp[j],dp[j-w[temp]]+v[temp]); } } } } printf("%d\n",dp[V]); return 0;}

 

转载于:https://www.cnblogs.com/wzrdl/p/9772338.html

你可能感兴趣的文章
Win8Metro(C#)数字图像处理--2.5图像亮度调整
查看>>
php安装php-redis模块
查看>>
无线网络破解________破解wap密码..............
查看>>
Matlab实现求a到b被c整除的个数
查看>>
Page Object设计模式
查看>>
RMI 相关知识
查看>>
Spring中@Async用法总结
查看>>
Spring data 如何定义默认时间与日期
查看>>
php 重置数组索引,兼容多维数组
查看>>
ARC 之内存转换
查看>>
输入密码与确认密码的匹配提示
查看>>
POI获取JXL生成的Excel带公式Cell返回空
查看>>
互联网项目经理工作到底是一种什么样的体验?
查看>>
php header 头输出 不同文档
查看>>
WIN7开发无法通过IP(127.0.0.1/10.4.250.107)而只能通过localh...
查看>>
Folding Views
查看>>
Android Camera2 使用总结
查看>>
android中menu的使用
查看>>
#!/usr/bin/env python与#!/usr/bin/python的区别
查看>>
11 个让你吃惊的 Linux 终端命令
查看>>