描述:

想去旅游吗?那得先准备背包!背包用来装旅游物品,现在共n种(n<=50)旅游物品,每种物品都有体积vi,重量wi,数量ci,价值ti (vi,wi,ci和ti都为整数)。
限制体积最多V立方厘米(V<=1000),重量最多W公斤(W<=500)。请问你如何选择物品,使得带上的物品总价值最大,这个最大总价值为多少?比如:
物品     体积       重量    数量    价值
编号  (立方厘米)  (公斤)   (个)    (元)1        30          3        10       42        50          8        10       53        10          2        10       24        23          5        8        35        130         20       5        11若V为500,W为100,则选择物品的最大价值为72(且72=10*4+10*2+4*3:由10件物品1,10件物品3,和4件物品4组成)。这是一个多维且有界的背包问题,属于常规0-1背包问题的扩展问题。

输入格式:
第一行,物品的种类n,背包体积的限制V,背包载重量的限制W。n,V和W的范围如前所述。
接下来n行,每行为该种物品i的体积vi,重量wi,数量ci,价值ti (规定vi,wi,ci和ti都为整数)。
输出格式:
仅一行,为选择物品子集所能获得的最大价值。
输入样例:
5 500 100
30 3 10 4
50 8 10 5
10 2 10 2
23 5 8 3
130 20 5 11
输出样例:
72

分析:
 发现对于这个题目,很多同学使用直接的递归方式完成,这里使用动态规划的方法完成。

 n种物品,每种物品体积v[i],重量w[i],c[i]件,价值t[i]。
设:m[i][x][y] 表示可选前i 种物品,所选物品总体积不超过x ,总重量不超过y ,的最大价值。
首先对三维数组初始化为0;

存在如下递归关系:
当 i=1 时:
m[1][x][y]=0                                      x<v[1]||y<w[1];
m[1][x][y]=min(x/v[1],y/[w[1],c[1])*t[1]          x>=v[1]&&y>=w[1];

当 i>1 时:
m[i][x][y]=max{m[i-1][x][y],m[i-1][x-k*v[i]][y-k*w[i]]+k*t[i]}      x>=v[i]&&y>=w[i];   其中:  0<k<min(x/v[i],y/w[i],c[i]);
m[i][x][y]=m[i-1][x][y]                                             x<v[i]||y<w[i];                     
k表示背包能放入i物品最多的件数;
   
代码如下:

#include<iostream>
using namespace std;int m[51][1001][501]={0};     //m[i][j][k] 表示可选前i 种物品,总体积不超过j, 总重量不超过k 的最大值
int v_arr[51];                //物品体积
int w_arr[51];                //重量
int c_arr[51];               //件数
int t_arr[51];               //价值int min(int a,int b,int c){        //三个数找最小int m;m=a;if(b<m)m=b;if(c<m)m=c;return m;
}void func(int v,int w,int n){    //可选前n个物品,体积不超过v,重量不超过wint i=0,j=0;int x=0,y=0;int k=0,max=0;for(x=0;x<=v;x++)for(y=0;y<=w;y++)if((x/v_arr[1]>0)&&(y/w_arr[1]>0))                               //x>=v_arr[1]&&y>=w_arr[1]m[1][x][y]=min(x/v_arr[1],y/w_arr[1],c_arr[1])*t_arr[1];     //m[1][x][y]取最大值elsem[1][x][y]=0;                                                //x<v_arr[1]&&y<w_arr[1]                   for(i=2;i<=n;i++)                                             //从第i=2开始填充for(x=0;x<=v;x++)for(y=0;y<=w;y++){max=m[i-1][x][y];if((x>=v_arr[i])&&(y>=w_arr[i])){for(k=0;k<=min(x/v_arr[i],y/w_arr[i],c_arr[i]);k++)if((m[i-1][x-k*v_arr[i]][y-k*w_arr[i]]+k*t_arr[i])>max)         //找出符合的最大的max=(m[i-1][x-k*v_arr[i]][y-k*w_arr[i]]+k*t_arr[i]);m[i][x][y]=max;}elsem[i][x][y]=m[i-1][x][y];}}int main(){int n=0;    //物品种类int v=0;    //背包体积int w=0;    //背包载重cin>>n>>v>>w;for(int i=1;i<=n;i++)cin>>v_arr[i]>>w_arr[i]>>c_arr[i]>>t_arr[i];func(v, w, n);cout<<m[n][v][w];return 0;
}
												

旅游背包(多维有界的背包问题)相关推荐

  1. 基础背包问题 - 多维有界背包问题 - 深度优先搜索 (递归)

    基础背包问题 - 多维有界背包问题 - 深度优先搜索 (递归) 1. 基础背包问题 背包问题 (Knapsack problem) 是一种组合优化的 NP 完全问题.给定一组物品,每种物品都有自己的重 ...

  2. 背包九讲之五(二维费用的背包问题)

    http://acm.fafu.edu.cn/problem.php?id=1499 1 /* 2 二维费用的背包问题是指:对于每件物品,具有两种不同的费用, 3 选择这件物品就必须付出这两种代价,每 ...

  3. 第五讲 二维费用的背包问题 HD FATE(二维完全背包)

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. 【python】一篇讲透背包问题(01背包 完全背包 多重背包 二维费用背包)

    面对背包问题,有一个很重要的方程式:状态转移方程式 所以每一种背包问题我都会给出状态转移方程式 #01背包 什么是01背包型问题? 先给大家感受一下01背包型问题: 给定n种物品和一背包.物品i的重量 ...

  5. UVA 10306 e-Coins(全然背包: 二维限制条件)

    UVA 10306 e-Coins(全然背包: 二维限制条件) http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Item ...

  6. HDU 2159 FATE 动态规划二维费用的背包问题

    http://acm.hdu.edu.cn/showproblem.php?pid=2159 题意: 给出的n , m , k ,s 分别代表还需n经验升级.还有m耐久度.下面有k组数据.最多能杀s只 ...

  7. 九大背包问题专题--二维费用的背包问题

    5.二维费用的背包问题 问题: 有N件物品和一个容量是V的背包,背包能承受的最大重量是M. 每件物品只能用一次,体积是vi,重量是mi,价值是wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过 ...

  8. xynuoj 1423 贪婪戈尔曼(二维费用的背包问题)

    1423: 贪婪戈尔曼 时间限制: 1 Sec  内存限制: 128 MB 提交: 26  解决: 16 您该题的状态:已完成 [提交][状态][讨论版] 题目描述 从前有2只狗,大的叫大狗,小的叫小 ...

  9. [01背包] 宠物小精灵之收服(01背包+二维费用背包+思维)

    文章目录 0. 前言 1. 01背包裸题 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包裸题 1022. 宠物小精灵之收服 每个精灵仅被收服一次,故可以考虑 01 背包,是典型 ...

  10. 潜水员 ← 二维费用的背包问题

    [题目来源] https://www.acwing.com/problem/content/1022/ [题目描述] 潜水员为了潜水要使用特殊的装备. 他有一个带2种气体的气缸:一个为氧气,一个为氮气 ...

最新文章

  1. pytorch 优化器 机器学习 调参
  2. 数据团队「隐形守护者」!从被动应对到资源输出,腾讯安全20年成长记
  3. iOS 获取self类型
  4. 软件级负载均衡器(LVS/HAProxy/LVS)的特点简介和对比
  5. hdu 5139(离线处理)
  6. 软件工程开篇自我介绍
  7. python语言中的数据类型之字典
  8. NSString属性什么时候用copy,什么时候用strong?【转】
  9. 暗物质影响星系,有没有影响太阳系
  10. 我珍藏很久的网盘资源搜索网站和下载神器
  11. 考勤机信息同步不到服务器,如何同步考勤机数据?
  12. awk , 统计secure.log中 每个破解你密码的ip的出现次数|access.log 中 每个ip地址出现的次数...
  13. 你知道硬齿面减速机价格为什么比齿轮减速机,蜗轮蜗杆减速机高?
  14. gitHub报错10054、443解决办法
  15. Android安全[app风险]
  16. 计算机网络期末考试知识点汇总
  17. 使用rke部署k8s集群
  18. 高通平台抓取WiFi日志
  19. SRv6技术课堂:SRv6概述
  20. 电脑C盘清理方法总结

热门文章

  1. ubuntu18打开网页慢的问题
  2. 测试一拳多少公斤的软件,李小龙一拳能打出400公斤,手里双节棍有多少力量,测试后难以置信...
  3. dropbox 下载不了问题
  4. 阿里巴巴图库下载的在线图标显示为方框的问题
  5. Excel四入五舍计算公式
  6. 第05篇:Mybatis的SQL执行流程分析
  7. 用Photoshop抠图
  8. 服务器虚拟化svc,服务器虚拟化与SVC技术在高校灾备中的应用
  9. java操作Excel表格使用EasyExcel
  10. EL表达式JSTL标签库小结