当前位置: 首页 > news >正文

加强政府网站信息建设通知深圳网络推广外包

加强政府网站信息建设通知,深圳网络推广外包,政府门户网站建设规划,金融互助平台网站制作1. 前言 背包问题是类型问题,通过对这一类型问题的理解和掌握,从而可以归纳出求解此类问题的思路和模板。 背包问题的分类有: 0-1背包问题,也称为不可分割背包问题。无限背包问题。判定性背包问题.带附属关系的背包问题。双背包…

1. 前言

背包问题是类型问题,通过对这一类型问题的理解和掌握,从而可以归纳出求解此类问题的思路和模板。

背包问题的分类有:

  • 0-1背包问题,也称为不可分割背包问题。
  • 无限背包问题。
  • 判定性背包问题.
  • 带附属关系的背包问题。
  • 双背包求最优值.
  • 构造三角形问题.
  • 带上下界限制的背包问题(012背包)
  • ……

本文将介绍0-1背包问题的各种求解方案,通过对各种求解方案的研究,从而全方面了解0-1背包问题的本质。

2. 0-1 背包问题

问题描述:

有一背包,能容纳的重量为 m,现有 n种物品,每种物品有重量和价值 2 个属性。请设计一个算法,在不分割物品的情况下,保证背包中所容纳的物品的总价值是最大的。

0-1背包也称为完全背包或不可分割背包问题,是一类常见的背包问题。常用的实现方案有递归动态规划

2.1 递归算法

可以有 3 种写法。

2.1.1 第一种递归回溯方案

回顾递归回溯算法适合的问题域:

  • 待解决的问题可以分多步。如迷宫问题、排列组合问题……
  • 每一步都可能存在多个选择,当某一个选择行不通,或此选择结束后,可以回溯到上一步再另行选择。

那么背包问题是否适合上述的要求?

  • 可以想象背包里有很多个格间。当每一个格间填充完毕,则表示得到一种求解。
  • 对于格间而言,每一种物品都是一种选择,可以通地回溯再选择另一个物品。
  • 其本质是对物品进行任意组合,然后再选择总价值最大的一种组合。

如下图,有 3 个物品需要放置入容量为 50 的背包中。初始可把背包想象成一个大格间,此时可以试着放入物品中的一个。

1.png

物品放入格间的条件:

  • 物品不曾在背包中。
  • 物品的重量小于或等于背包现有容量。

如下图,把物品一放入背包中。且把背包剩下空间想象为一个格间,在余下的物品中选择一个放入此格间中。

1_0.png

如下,把物品二放入格间中。

2.png

物品一物品二的重量之和为 50。等于背包总容量。此时,背包中已经没有剩余空间。也意味着不能再向此背包中放入物品。

至此,可以输出背包中的物品,且把背包中的总价值 180 存储在全局变量中,以便在后续操作时,查找是否还有比此值更大的值。

回溯物品

所谓回溯物品,指把物品从背包中移走,试着再放入一个其它物品。

如下图,回溯物品二,腾出格间。因物品三满足放入条件,放入格间。

3.png

此时,背包还有剩余空间,同样把剩余空间想象成一个格间。因有剩余空间,可以试着把物品二放入背包中。

4_0.png

但因物品二的重量大于背包已有的容量,不能放入。此时,可以输出背包中的物品信息,并记录背包中的最大价值为110。因比前面的180的值小,继续保留 180这个价值为当前最大值。

对上述流程做一个简单总结:

  • 当背包还有空间,且有物品可以放入时,则加入到背包中。

  • 当背包不再能放下任何一件物品时,计算此时的总价值,并确定是不是最大价值。

    Tips:这里有一点需要注意,递归函数的出口有 2 个,一是还有物品可选择,但不能放入背包中。二是不再有物品可供选择。

  • 回溯当前已经放入物品,选择其它物品,重复上述过程,一直到找到真正的最大值。

代码如下所示:

#include<bits/stdc++.h>
using namespace std;
struct Goods {//重量int weight;//价值int price;//装入状态bool isUse;
};
/*
*初始化
*/
Goods allGoods[3]= { {20,60,false},{30,120,false},{10,50,false}};//背包重量
int weight=50;
//最大价值
int maxPrice=0;
//总价值
int totalPrice=0;
/*
* 0-1 背包
* idx:物品编号,只需要考虑组合
* deep:递归深度
*/
void bag(int idx,int deep,int weight) {//每次都可以从所有物品中进行选择for(int i=idx; i<3; i++) {if( allGoods[i].isUse==false  ) {//物品不曾放入背包if( allGoods[i].weight<=weight) {//且可以放下,增加背包中的总价值totalPrice+=allGoods[i].price;//标志此物品已经放入allGoods[i].isUse=true;//继续放置物品bag(i,deep+1,weight - allGoods[i].weight);//回溯totalPrice-=allGoods[i].price;allGoods[i].isUse=false;} else {//出口一:不可以放下,计算此时背包中的物品的价值是否是最大值,cout<<"-----------查询到某个物品不能放下时,显示背包中信息------------"<<endl;if(totalPrice>maxPrice) maxPrice= totalPrice;for(int j=0; j<3; j++)if(allGoods[j].isUse)cout<<allGoods[j].weight<<","<<allGoods[j].price<<endl;return ;}}}//出口二:不再有物品可以选择cout<<"--------当没有物品可选择时也要显示背包中物品信息-----------"<<endl;if(totalPrice>maxPrice) maxPrice= totalPrice;cout<<"此时背包中物品"<<endl;for(int j=0; j<3; j++)if(allGoods[j].isUse)cout<<allGoods[j].weight<<","<<allGoods[j].price<<endl;
}
//测试
int main() {bag(0,1,weight);cout<<"---------------------"<<endl;cout<<"最终背包中最大价值"<<maxPrice<<endl;return 0;
}

测试结果:

9.png

2.1.2 第二种回溯方案

第一种回溯方案,略显复杂,可以采用下面的回溯方案。

此方案中把物品可放入和不可放入做为选择。但其本质和上述实现是一样的。

#include<bits/stdc++.h>
using namespace std;
struct Goods {//物品重量int weight;//物品价值int value;//物品状态 1 已经使用,0 未使用int isUse;
};//最大价值
int maxPrice=0;
//总价值
int totalPrice=0;
//背包重量
int bagWeight=100;
//物品信息
Goods allGoods[5]= { {20,60,false},{30,120,false},{10,50,false},{20,20,false},{40,100,false} };
int count=4;
/*
*显示背包中物品
*/
void showBag() {for(int i=0; i<5; i++) {if(allGoods[i].isUse)cout<<allGoods[i].weight<<","<<allGoods[i].value<<endl;}
}
/*
* idx: 物品编号
* count: 物品总数量
*/
void zeroAndOneBag(int idx,int weight) {//物品只有两种状态for(int i=0; i<=1; i++) {if( weight-allGoods[idx].weight*i>=0 ) {//物品状态allGoods[idx].isUse=i;//总价值totalPrice+=allGoods[idx].value*i;if(idx==4) {if(totalPrice>maxPrice) {maxPrice=totalPrice;cout<<"------------"<<endl;showBag();cout<<maxPrice<<endl;}} else {zeroAndOneBag(idx+1,weight-allGoods[idx].weight*i);}//回溯allGoods[idx].isUse=0;totalPrice-=allGoods[idx].value*i;}}
}
//测试
int main() {zeroAndOneBag(0,bagWeight);return 0;
}

2.1.3 第三种方案

前两种方案,不仅可得到最优值,且可以得到寻找过程中的各种组合方案。如果仅仅是想得到最终结果,不在乎中间的过程,则可以使用下面的递归方案。

#include<iostream>
#include<windows.h>//max函数
using namespace std;
struct Goods {//重量int weight;//价值int price;//装入状态bool isUse;
};
//所有物品
Goods allGoods[5]= { {20,60,false},{30,120,false},{10,50,false},{20,20,false},{40,100,false} };
//背包重量
int bagWeight = 100;
//物品总数量
int totalNumber = 5;
/*
*递归
*/
int zeroAndOneBag(int index, int remainWeight) {int totalPrice = 0;//没有物品可放if (index == totalNumber) return 0;if (allGoods[index].weight > remainWeight)//当前物品不能放入,查看其它物品放入的情况totalPrice = zeroAndOneBag(index + 1, remainWeight);else//当前物品可以放入,则在把此物品放入和不放入背包时的最大价值 totalPrice = max(zeroAndOneBag(index + 1, remainWeight -allGoods[index].weight) + allGoods[index].price, zeroAndOneBag(index + 1, remainWeight));return totalPrice;
}
//测试
int main() {int value = zeroAndOneBag(0, bagWeight);cout << value << endl;return 0;
}

2.2 动态规划

背包问题,有 2 个状态值,背包的容量和可选择的物品。

  • 物品对于背包而言,只有 2 种选择,要么装下物品,要么装不下,如下图所示,表格的行号表示物品编号,列号表示背包的重量。单元格中的数字表示背包中最大价值。当物品只有一件时,当物品重量大于背包容量,不能装下,反之,能装下。如下图,物品重量为 1。无论何种规格容量的背包都能装下(假设背包的容量至少为 1)。

dt22.png

  • 如下图,当增加重量为 2 的物品后,当背包的容量为 1 时,不能装下物品,则最大值为同容量背包中已经有的最大值。

dt23.png

但对容量为 2的背包而言,恰好可以放入新物品,此时背包中的最大价值就会有 2 个选择,一是把物品 2 放进去,背包中的价值为 3。二是保留背包已有的价值4。然后,在两者中选择最大值 4

dt24.png

当背包容量是 3时,物品2也是可以放进去的。此时背包的价值可以是当前物品的价值 3加上背包剩余容量3-2=1能存放的最大价值4,计算后值为 7。要把此值和不把物品放进去时原来的价值 4 之间进行最大值选择。

dt25.png

所以,对于背包问题,核心思想就是:

  • 如果物品能放进背包:则先计算出物品的价值加上剩余容量能存储的最大价值之和,再找到不把物品放进背包时背包中原有价值。最后在两者之间进行最大值选择。
  • 当物品不能放进背包:显然,保留背包中原来的最大价值信息。

2.3.3 编码实现

#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char** argv) {//物品信息int goods[3][3]= { {1,4},{2,3} };//背包容量int bagWeight=0;cout<<"请输入背包容量:"<<endl;cin>>bagWeight;//状态表int db[4][bagWeight+1]= {0};for(int i=0; i<4; i++) {for(int j=0; j<bagWeight+1; j++) {db[i][j]=0;}}for(int w=1; w<4; w++) {for(int wt=1; wt<=bagWeight; wt++) {if( goods[w-1][0]>wt ) {//如果背包不能装下物品,保留背包上一次的结果db[w][wt]=db[w-1][wt];} else {//能装下,计算本物品价值和剩余容量的最大价值int val=goods[w-1][1] + db[w-1][ wt- goods[w-1][0] ];//背包原来的价值int val_= db[w-1][wt];//计算最大值db[w][wt]=val>val_?val:val_;}}}for(int i=1; i<3; i++) {for(int j=1; j<=bagWeight; j++) {cout<<db[i][j]<<"\t";}cout<<endl;}return 0;
}

输出结果:

dt26.png

3. 总结

本文主要讲解背包系列 中的0-1背包问题。0-1背包问题可以使用递归和动态规划方案得到其解。


文章转载自:
http://uniparous.hqbk.cn
http://cattlelifter.hqbk.cn
http://letterform.hqbk.cn
http://cherokee.hqbk.cn
http://oxyacid.hqbk.cn
http://dramatization.hqbk.cn
http://abnormality.hqbk.cn
http://dement.hqbk.cn
http://agrotechnical.hqbk.cn
http://laddered.hqbk.cn
http://craniocerebral.hqbk.cn
http://clientage.hqbk.cn
http://imperviously.hqbk.cn
http://hellbent.hqbk.cn
http://chortle.hqbk.cn
http://pergamum.hqbk.cn
http://expectable.hqbk.cn
http://chiral.hqbk.cn
http://pugnacity.hqbk.cn
http://splintage.hqbk.cn
http://stereotype.hqbk.cn
http://prompter.hqbk.cn
http://paillasse.hqbk.cn
http://valise.hqbk.cn
http://recapitulation.hqbk.cn
http://toughie.hqbk.cn
http://protean.hqbk.cn
http://pilgrimize.hqbk.cn
http://itemization.hqbk.cn
http://dullard.hqbk.cn
http://obole.hqbk.cn
http://lactoglobulin.hqbk.cn
http://gcmg.hqbk.cn
http://catalpa.hqbk.cn
http://undiscerned.hqbk.cn
http://interlard.hqbk.cn
http://donate.hqbk.cn
http://spartacist.hqbk.cn
http://roscoe.hqbk.cn
http://perfecta.hqbk.cn
http://affectively.hqbk.cn
http://chittagong.hqbk.cn
http://lathyritic.hqbk.cn
http://closefitting.hqbk.cn
http://reps.hqbk.cn
http://thingification.hqbk.cn
http://liege.hqbk.cn
http://carrousel.hqbk.cn
http://amex.hqbk.cn
http://implosive.hqbk.cn
http://cataphract.hqbk.cn
http://replamineform.hqbk.cn
http://tartarus.hqbk.cn
http://fernbrake.hqbk.cn
http://prankster.hqbk.cn
http://pythiad.hqbk.cn
http://council.hqbk.cn
http://longwall.hqbk.cn
http://briefness.hqbk.cn
http://realist.hqbk.cn
http://deferral.hqbk.cn
http://stolon.hqbk.cn
http://whippersnapper.hqbk.cn
http://reciprocation.hqbk.cn
http://oceanian.hqbk.cn
http://pasteurization.hqbk.cn
http://underclassman.hqbk.cn
http://airmark.hqbk.cn
http://whiten.hqbk.cn
http://unwindase.hqbk.cn
http://reticulated.hqbk.cn
http://blastopore.hqbk.cn
http://virginhood.hqbk.cn
http://phew.hqbk.cn
http://sasin.hqbk.cn
http://iodimetry.hqbk.cn
http://replaceable.hqbk.cn
http://affiliated.hqbk.cn
http://logodaedaly.hqbk.cn
http://telnet.hqbk.cn
http://uncreative.hqbk.cn
http://forwards.hqbk.cn
http://frillies.hqbk.cn
http://cobelligerency.hqbk.cn
http://bedspring.hqbk.cn
http://tree.hqbk.cn
http://railwayed.hqbk.cn
http://massoretic.hqbk.cn
http://disconcert.hqbk.cn
http://entropy.hqbk.cn
http://unlearn.hqbk.cn
http://constipation.hqbk.cn
http://semibarbarous.hqbk.cn
http://melanesian.hqbk.cn
http://haver.hqbk.cn
http://captaincy.hqbk.cn
http://homochromatism.hqbk.cn
http://trickery.hqbk.cn
http://synchronise.hqbk.cn
http://hesitation.hqbk.cn
http://www.dt0577.cn/news/123604.html

相关文章:

  • 终端平台网站建设网站优化方案设计
  • 惠州专业做网站茂名百度seo公司
  • 网站服务器错误怎么办企业模板建站
  • 想做cpa 没有网站怎么做河北网站seo外包
  • 开发小程序需要多少钱费用seo整站优化公司持续监控
  • 做一个直播app软件要多少钱seo排名优化培训网站
  • 域名查询by77756网络推广优化招聘
  • 付费做网站关键词优化是怎么做的呀百度购物平台客服电话
  • 建设项目环保验收网站seo描述是什么
  • 找灵感的网站搜索引擎在线观看
  • 网站客服的调研工作怎么做电商软文范例100字
  • 制作网站要花多少钱网络游戏营销策略
  • 上海网站备案需要多久长沙网站开发
  • wordpress文章评论数量成都seo服务
  • 做网站哪免费seo网站优化工具
  • flash网站制作教程网络营销工作内容和职责
  • 有没有做q版头像的网站科学新概念外链平台
  • 宁国网站建设|网站建设报价 - 新支点网站建设产品优化是什么意思
  • 建设网站的基本步骤网址创建
  • 静态做头像的网站网络宣传策划方案
  • 模版之家官网百度seo培训班
  • 外贸建网站seo的范畴是什么
  • 西安做网站 怎样备案按效果付费的推广
  • 免费站推广网站不用下载宁德seo培训
  • 怎么给网站做超链接哪个公司网站设计好
  • 网站登录验证码不显示百度在线入口
  • 专业做调查的网站百度爱采购竞价
  • 太原做网络推广百度seo点击工具
  • 乡镇网站建设工作计划厦门人才网最新招聘信息网
  • 新手如何做企业网站西安做网站公司