博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu2191 多重背包
阅读量:4356 次
发布时间:2019-06-07

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

题目链接:

多重背包:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。

              求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

有两种思路,其中一种是转换为01背包,还有一种就是转换为01背包和完全背包。

转换为01背包代码:

//转换为01背包的代码#include
#include
#include
using namespace std;const int N=105;const int MAXW=4005;int v[N],w[N],num[N];int dp[MAXW];int main(){ int t; cin>>t; while(t--) { int n,m; cin>>n>>m; for(int i=0; i
>w[i]>>v[i]>>num[i]; memset(dp,0,sizeof(dp)); for(int i=0; i
=w[i]; k--) dp[k]=max(dp[k],dp[k-w[i]] +v[i]); cout<
<

 

多重背包转换成完全背包和01背包:

0--N中的任何一个数都可以用N的二进制的位数个数表示,这些数分别是1....1<<i   untile 1<<i   < N  && 1<<(i+1) >N  另外一个是N-前面所有二进制数的总和。

所以多重背包转换成完全背包和01背包的过程中01背包的部分可以用二进制优化。 

代码:

#include
#include
#include
#include
using namespace std;#define ll long longint p[205],w[205],c[205];int dp[105];int main(){ int T; cin>>T; while(T--) { int n,m; cin>>n>>m; for(int i=1; i<=m; i++) cin>>p[i]>>w[i]>>c[i]; memset(dp,0,sizeof(dp)); for(int i=1; i<=m; i++) { if(p[i]*c[i]>m) { for(int j=p[i]; j<=n; j++) dp[j]=max(dp[j],dp[j-p[i]]+w[i]); } else { int k=1; for(int j=1; c[i]>0; j<<=1) { int temp=min(j,c[i]); for(int q=n; q>=temp*p[i]; q--) dp[q]=max(dp[q],dp[q-p[i]*temp]+w[i]*temp); c[i]-=j; } } } cout<
<

 

 

转载于:https://www.cnblogs.com/a-clown/p/5953847.html

你可能感兴趣的文章
Python列表、元组练习
查看>>
angular页面刷新
查看>>
Leetcode:7- Reverse Integer
查看>>
C6表单(方成eform)---自定义流程标题格式
查看>>
GridView下DropDownList 的选择方法onselectedindexchanged 实现方法
查看>>
Python之set集合
查看>>
Generic Repository Pattern - Entity Framework, ASP.NET MVC and Unit Testing Triangle
查看>>
Win7 下新版本Windows Virtual PC 安装SharePoint步骤详解
查看>>
SQLSERVER 升级版本的方法
查看>>
正则表达式基本语法详解
查看>>
BZOJ2132: 圈地计划
查看>>
PHP数据库连接mysql与mysqli的区别与用法
查看>>
char * 与char []探究理解
查看>>
QT窗体显示在屏幕中间位置
查看>>
emmet使用技巧
查看>>
RPC-Thrift(二)
查看>>
MSSQL for Linux 安装指南
查看>>
【Golang 接口自动化08】使用标准库httptest完成HTTP请求的Mock测试
查看>>
洛谷 P1036 选数
查看>>
女性社区TOP10
查看>>