java蛮力法背包问题_[算法课]五种蛮力法解决01背包问题

文章目录

注明:题目要求只能使用蛮力法

算法标签:全排列,枚举,二进制,dfs,数组

题目简介

思路

AC代码

方法一:字符串蛮力

方法二:二进制枚举

方法三:DFS

三.2闫老板思考角度

方法四:全排列

方法五:数组蛮力

答案

注明:题目要求只能使用蛮力法

算法标签:全排列,枚举,二进制,dfs,数组

题目简介

0/1背包问题【算法中非常经典的一个例题,多种不同的算法可以来实现】

有n个重量分别是w1,w2…,wn的物品(物品编号为1-n)

它们的价值分别为v1,v2,…,vn

给定一个容量为W的背包。设计从这些物品中选取一部分放入该背包的方案。

每个物品要么选中要么不选中【每种物品是唯一的】,

要求选中的物品不仅能够放在背包中【能放得下】,而且具有最大的价值。

并对如下所展示的5个物品求出W=10时的最佳解。

物品编号 重量 价值

1 2 6

2 2 3

3 6 5

4 5 4

5 4 6

分析:并对如的5个物品求出W不超过10时的最佳解。

思路

我们设定有五个物品

五个物品一开始都不选

用string表示为 00000

用j来控制状态选择

1

我们可以利用穷举写出5个变量的全排列

而5个变量分别可以代表的当前状态下的当前位子的选择

于是我们建立新的字符串,全排列的中的状态赋值即可,这样我们就得到了所有可能的选择状态。

然后更新maxv和str即可

2

用二进制枚举

形如1000001

11110001

1表示选择,0表示未选择的方式

可参考我写的得到整数X

AC代码

方法一:字符串蛮力

#include

#include

#include

using namespace std;

int main()

{

int W = 10, n = 5;

int w[5] = { 2,2,6,5,4 }, v[5] = { 6,3,5,4,6 };

string pres = "00000";

int ww = 0, vv = 0, maxv = 0;

string str;

char s[1000];

for (int j = 0; j < 5; j++)

for (int a = 0; a < 5; a++)

for (int b = 0; b < 5; b++)

for (int c = 0; c < 5; c++)

for (int d = 0; d < 5; d++)

for (int e = 0; e < 5; e++)

{

if (a != b && a != c && a != d && a != e);

if (b != c && b != d && b != e);

if (c != d && c != e);

if (d != e);

pres[j]='1';

s[0] = pres[a];

s[1] = pres[b];

s[2] = pres[c];

s[3] = pres[d];

s[4] = pres[e];

//cout << s[0] << " " << s[1] << " " << s[2] << " " << s[3] << " " << s[4] << " " << endl;

for (int i = 0; i < 5; i++)ww += (s[i] - '0')*w[i], vv += (s[i] - '0')*v[i];

//当前背包重量不超过容量,且vv当前背包价值大于最大价值

if (ww <= W && vv > maxv)maxv = vv, str = s;//记录此时的s的组合

vv = 0, ww = 0;

}

for (int i = 0; i < 5; i++)cout << str[i];

cout << endl;

cout << maxv << endl;

return 0;

}

方法二:二进制枚举

#include

using namespace std;

int ww,vv,maxv,strres;

int main()

{

int W = 10;

int w[5] = { 2,2,6,5,4 }, v[5] = { 6,3,5,4,6 };

for(int i=0;i<1<<5;i++)//二进制最大可能选择数

{

for(int j=0;j<5;j++)ww += (i>>j&1)*w[j], vv += (i>>j&1)*v[j];/判断当前位子是否被选择,更新0或1倍目标值的数值

if (ww <= W && vv > maxv)maxv = vv,strres=i;//更新

vv = 0, ww = 0;

}

for(int i=0;i<5;i++)cout<>i&1);//因为是选择情况,所以直接输出

cout<

cout << maxv;

return 0;

}

方法三:DFS

无法保存最大路径

#include

using namespace std;

int ww,vv,maxv,strres;

int W = 10;

int w[5] = { 2,2,6,5,4 }, v[5] = { 6,3,5,4,6 };

int str[5];

int ans[5];

void dfs(int tw,int ans)

{

if(tw<=W&&ans > maxv){maxv = ans;return ;}

for(int i=0;i<5;i++)

if(!str[i]&&tw>=w[i])

{

str[i]=1;

dfs(tw-w[i],ans+v[i]);

str[i]=0;

}

}

int main()

{

dfs(W,0);

cout << maxv;

return 0;

}

三.2闫老板思考角度

#include

using namespace std;

int w[5] = { 2,2,6,5,4 }, v[5] = { 6,3,5,4,6 };

int x[5];

int maxv = 0;

int ans[5];

void dfs(int i, int ww, int vv)

{

if (i == 5)

if (ww <= 10 && vv > maxv) { maxv = vv; for(int i=0;i<5;i++)ans[i]=x[i];return; }//记录最优状态

else return;//这里给他加了个退出

x[i] = 1;

dfs(i + 1, ww + w[i], vv + v[i]);

x[i]=0;

dfs(i + 1, ww, vv);

}

int main()

{

dfs(0, 0, 0);

for(auto x:ans)cout<

cout<

cout << maxv;

return 0;

}

方法四:全排列

利用next_permuatation的特性,全排列,而我们只需要截取前面五位的状态即可

#include

#include

#include

using namespace std;

int main()

{

int W = 10, n = 5;

int w[5] = {2, 2, 6, 5, 4}, v[5] = {6, 3, 5, 4, 6};

string s = "0000011111";

int ww = 0, vv = 0, maxv = 0;

string str;

for (int j = 0; j < n; j++)

{

do

{

for (int i = 0; i < n; i++)ww += (s[i] - '0') * w[i], vv += (s[i] - '0') * v[i];

//当前背包重量不超过容量,且vv当前背包价值大于最大价值

if (ww <= W && vv > maxv)maxv = vv, str = s; //记录此时的s的组合

vv = 0, ww = 0;

} while (next_permutation(s.begin(),s.end()));

}

for(int i=0;i<5;i++)cout << str[i];

cout<

cout << maxv;

return 0;

}

方法五:数组蛮力

利用数组表示01

#include

#include

#include

using namespace std;

int s[5];

int main()

{

int W = 10, n = 5;

int w[5] = { 2,2,6,5,4 }, v[5] = { 6,3,5,4,6 };

int ww = 0, vv = 0, maxv = 0;

string str;

for (s[0]=0; s[0] < 2; s[0]++)

for (s[1]=0; s[1] < 2; s[1]++)

for (s[2]=0; s[2] < 2; s[2]++)

for (s[3]=0; s[3] < 2; s[3]++)

for (s[4]=0; s[4] < 2; s[4]++)

{

for (int i = 0; i < 5; i++)ww += (s[i])*w[i], vv += (s[i])*v[i];

if (ww <= W && vv > maxv)maxv = vv;

vv = 0, ww = 0;

}

cout << maxv << endl;

getchar(); getchar();

return 0;

}

答案

11001

15

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这16个数据可视化案例,惊艳了全球数据行业

数据可视化可以帮你更容易的解释趋势和统计数据。数据是非常强大的。当然&#xff0c;如果你能真正理解它想告诉你的内容&#xff0c;那它的强大之处就更能体现出来了。通过观察数字和统计数据的转换以获得清晰的结论并不是一件容易的事。必须用一个合乎逻辑的、易于理解的方式…

asp.net core 自定义 Content-Type

asp.net core 实现支持自定义 Content-TypeIntro我们最近有一个原本是内网的服务要上公网&#xff0c;在公网上有一层 Cloudflare 作为网站的公网流量提供者&#xff0c;CloudFlare 会有一层防火墙拦截掉一些非法的请求&#xff0c;我们有一些 API 会提交一些 html 内容&#x…

left outer join 和 right outer join 和 join 的区别

举个例子你就能知道了&#xff01;A表(a1,b1,c1) B表(a2,b2)a1 b1 c1 a2 b201 数学 95 01 张三02 语文 90 02 李四03 英语 80 04 王五select A.*,B.* from A inner join B on(A.a1B.a2)结果是&#xff1a;a1 b1 c1 …

liunx+java+jar+运行_Linux后台运行java的jar包

Linux 运行jar包命令如下&#xff1a;方式一java -jar shareniu.jar特点&#xff1a;当前ssh窗口被锁定&#xff0c;可按CTRL C打断程序运行&#xff0c;或直接关闭窗口&#xff0c;程序退出那如何让窗口不锁定&#xff1f;方式二java -jar shareniu.jar &&代表在后台…

如何优雅的移植JavaScript组件到Blazor

Blazor作为一个新兴的交互式 Web UI 的框架&#xff0c;有其自身的优缺点&#xff0c;如果现有的 JavaScript 组件能移植到 Blazor&#xff0c;无疑让 Blazor 如虎添翼&#xff0c;本文就介绍一下自己在开发 BulmaRazor 组件库的时&#xff0c;封装现有的 JavaScript 组件的方法…

把握人工智能命脉的有效方法

最近广州的天气老是变幻无常&#xff0c;往往今天还热得要命第二天就寒风瑟瑟&#xff08;如下图&#xff09;&#xff0c;让小天甚是怀念每天艳阳高照的夏天&#xff0c;虽然热了点但好歹不用担心猝不及防地收到寒风暴雨黄色预警。说到夏天&#xff0c;不得不提一下1956年的那…

取消智能菜单功能

如果你用惯了 Office 97&#xff0c;再使用 Office 2000 的话&#xff0c;可能对 Office 2000 里的菜单显示方式会感到不习惯&#xff0c;因为它不会一次显示出来&#xff0c;还要按一下下面的箭头&#xff0c;或是单击菜单的最上面&#xff0c;它才会一次通通显示出来。 这是 …

微软的焦虑?想多了!从.NET6 Preview2到大厂招聘,起飞

看了篇文章叫《从.NET看微软的焦虑》&#xff0c;这里忍不住先吐槽一下&#xff0c;看完不仅毫无收获&#xff0c;而且有一种先起个夺眼球的标题&#xff0c;然后再东拼西凑找证据。讲真的&#xff0c;微软市值基本上等于“阿里腾讯百度”三者之和&#xff0c;居然还焦虑的无法…

TED演讲:区块链将如何改变世界?看完太震撼了!

区块链是什么&#xff1f;如果你不知道&#xff0c;你应该了解&#xff1b;如果你知道&#xff0c;有可能你仍需要了解一些它工作原理。唐泰普斯科特在此使这改变世界、建立信任的科技变得简明易懂。他表示&#xff0c;这就是第二代互联网&#xff0c;将有可能改变我们的金钱、…

getopt()简介

函数getopt()用来分析命令行参数&#xff0c;其函数原型和相关变量声明如下&#xff1a; #include extern char *optarg; extern int optind, // 初始化值为1&#xff0c;下一次调用getopt时&#xff0c;从optind存储的位置重新开始检查选项&#xff0c;也就是从下一个-的选项…

re管理器Java_自定义布局管理器-FormLayout

第二部分&#xff1a;自定义布局管理器在java.awt包与javax.swing包下有许多现成的布局类&#xff0c;比如BorderLayout、FlowLayout&#xff0c;还有较为复杂的、用于精确定位的布局类GridBagLayout、SpringLayout等。起初我刚刚从事gooey时(06年中)&#xff0c;企图依靠JDK自…

如何看待 70% 的程序员,缺乏数据结构和算法知识?

金三银四来了&#xff0c;各大厂动静不小&#xff0c;都在储备人才&#xff0c;绝对是程序员面试的黄金时间了&#xff0c;不少同学也在后台反馈面试中遇到的一些问题&#xff0c;所以今天想跟大家说说算法。说起算法&#xff0c;那大厂面试是绝对必考的&#xff0c;可以说是一…

Sorry,关注这些 IT 技术类公众号,真的可以为所欲为

工作和生活节奏超快的今天&#xff0c;想要不断提升自我&#xff0c;碎片化阅读学习是你最佳的选择&#xff0c;如果你已经有了一颗学习的心&#xff0c;却苦于不知道从哪里学习&#xff0c;那么&#xff0c;这些学习的工具和途径就很重要了。今天为你推荐一些 IT技术领域的微信…

理解T-SQL:高级查询

1. 子查询 子查询是嵌套在其它查询中常规的SQL查询&#xff0c;当需要一个Select语句作为数据部分的基础或另一个查询中的条件的要素时&#xff0c;就是创建子查询 子查询经常满足下列几种需求&#xff1a; a. 把一个查询分解成一系列的逻辑步骤 b. 提供一个列表作为wh…

java hdms_字段为clob类型,无法插入数据

public String getHdmsStr() throws SQLException, IOException {if(this.hdms!null){Reader is hdms.getCharacterStream();BufferedReader br new BufferedReader(is);String s br.readLine();StringBuffer sb new StringBuffer();while (s ! null) {// 执行循环将字符串…

谈谈低代码趋势和开发人员的未来

最近的低代码平台很火&#xff0c;不光是大厂在扎堆研发&#xff0c;也有很多创业企业在做&#xff0c;大量的资金投入到这个领域&#xff0c;虽然在软件行业&#xff0c;一直是有这个梦想&#xff08;就是让所有人都可以编程&#xff09;&#xff0c;但忽如一夜春风来&#xf…

java跨库调用存储_存储库仅在第二个调用数据时发送回ViewModel

问题&#xff1a;My Fragment仅在第二次调用时获取数据(例如&#xff0c;当我旋转屏幕时) .在我看来&#xff0c;这些代码行是repo类中的问题&#xff1a;public class UserRepository {private Webservice webservice;// ...public LiveData getUser(int userId) {// This isn…

数据告诉你,抖音是如何在半年之内逆袭的

从春节至今&#xff0c;音乐短视频社区“抖音”在苹果应用商店免费排行榜上连续多天霸榜。凭借多元的音乐风格、酷炫的视觉编辑功能、个性化的分发机制以及良好的社区氛围&#xff0c;抖音在上线不久后便受到了年轻用户的追捧。在这一年半的时间里&#xff0c;抖音到底成长到了…

你是哪种职场性格?

俗话说&#xff0c;性格决定一切。虽然有些言过其实&#xff0c;但在如今的职场上&#xff0c;个人的“职场性格”因素的确非常重要&#xff0c;它决定着你的职场表现&#xff0c;影响着上司对你的看法&#xff0c;左右着你的职业发展。因此&#xff0c;了解自己的“职场性格”…

非名校出身的我,是如何拿到Facebook、谷歌、微软、亚马逊和Twitter的Offer的?

非名校出身&#xff0c;也没有知名科技公司的工作经验&#xff0c;他竟同时拿到了美国5家顶尖科技公司的Offer。他究竟是如何做到的&#xff1f;这篇文章是专门为那些即将开始找工作的人写的。很多正在找工作的人可能会担心因为自己不是毕业于常青藤名校而无法在顶尖科技公司找…