网易在线笔试牛牛的背包

2023-10-20 00:58

本文主要是介绍网易在线笔试牛牛的背包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


        背包问题首先想到的就是动态规划了,但是这相当于遍历没一种可能性,当背包容量足够大,

零食种类足够多的时候就会出现超时的情况。

问题等价于   


其中, 表示第i个放入还是不放入, 设state(i,w)表示i个零食放入背包小于等于W的个数,把state(i,w)分解,可以分解为两个情况:
1、是第 i个不放入时,前i-1个零食放入背包小于等于W的种数即state(i-1,w);
2、是在第i个放入的情况下,前i-1个零食放入背包体积小于等于W-v[i]的个数即state(i-1,w-v[i]);
即               state(i,w) = state(i-1,w) + state(i-1,w-v[i])
边界条件:i = 1时,state(1,w1) 此时如果w1 >0 且v[1]<=w1,state(1,w1) = 2,即有可放入和不放入两种;
i = 1 时,swate(1,w1)此时如果w1 >0且v[1] > w1,state(1,w1)=1,即只有不放入一种;
如果state(i,w)中出现w<=0,则state(i,w)=0;
例子:零食体积1 2 4,w=10
则 state(3,10) = state(2,10) + state(2,6)
= state(1,10) + state(1,8) + state(1,6) + state(1,4)
= 2 + 2 + 2 + 2 = 8
采用递归解法:AC率80%。简简单单的代码实现如下


#include<iostream>
#include<vector>
using namespace std;int f(int n1, int n2,vector<int> &num)
{if(n2 <= 0){return 0;}if(n1 == 1){if(num[n1] <= n2){return 2;}else{return 1;}}return f(n1-1,n2,num) + f(n1 - 1,n2-num[n1],num);
}
int main()
{int n1,sum;cin >> n1 >> sum;vector<int> res(n1 + 1);for(int i=1;i<=n1;i++){cin >> res[i];}cout << f(n1,sum,res) << endl;                          return 0;
}
另一种思路是基于 DFS搜索的算法
#include <iostream>
#include <vector>
#include <cmath> //pow()函数头文件
using namespace std;
long long n, w;
vector<long long> good;
long long result = 0;
void dfs(int cur, long long sum)
{
if (sum <= w && cur == n)
result++;
if (cur == n || sum > w)
return;
dfs(cur + 1, sum + good[cur]);
dfs(cur + 1, sum);  //两次递归,相当于实现了选与不选,第二次是回溯的关键
}
int main() {
cin >> n >> w;
good.resize(n);
long long sum = 0;
for (int i = 0; i < n; i++) {
cin >> good[i];
sum += good[i];
}
if (sum <= w) {
//全部都可以放入
result = pow(2, n);
}
else {  //注意这里没加排序,加上会更好
dfs(0, 0);
}
cout << result << endl;
return 0;
}
​
//这个方法是别人的  DFS中看不到回溯,反正我是没看懂
#include<iostream>
#include<algorithm>
using namespace std;
long long nums = 1;
void DFS(vector<long long>& array, int size , long long w, long long sum, int pos){if(sum <= w){nums++;for(int i = pos + 1 ; i < size ; ++i) //问题就出现在这里{DFS(array,size,w,sum+array[i],i);}}
}
int main()
{int n;long long  w;cin >>n >> w;long long total = 0;vector<long long > array(n,0);for(int i = 0 ; i != n ; ++i){cin >> array[i];total += array[i];}if(total <= w){nums = pow(2,n);}else{sort(array.begin(),array.end()); //对数组进行排列,难道问题出现在这里?????? for(int i = 0 ; i != n ; ++i) //问题也出现在这里,这两个for循环DFS(array, array.size(), w, array[i],i);}cout<<nums<<endl;return 0;
}
#include <stdio.h>
#include <stack>
using namespace std;
struct TreeNode{int val;TreeNode *left;TreeNode *right;TreeNode (int x):val(x),left(NULL),right(NULL){}
};
// 非递归的后续遍历,另需要一个辅助指针
void preorder2(TreeNode *node)
{stack<TreeNode *> stack;TreeNode * p =node; //p是个工作指针TreeNode * pree ; //p是个前驱指针,记录访问过的节点int flag =1; while(p || !stack.empty()){while(p!=NULL)        {   //左子树一直入栈            stack.push(p);             //printf("[%d]\n",p->val);            p = p ->left;                   }         pree = NULL;         flag =1; //辅助变量为1表示当前节点的左孩子为空或者已经被访问过        while(!stack.empty() && flag==1)        {                    p =stack.top();             //如果右结点为空,或者左结点之前遍历过,打印根结点            if( p->right ==pree )            {            printf("[%d]\n",p->val);            pree = p;            stack.pop();            }            else //处理右孩子            {p = p -> right;             flag = 0; //*p的左孩子未被访问            }        }       }    }
int main()
{ TreeNode a(1); TreeNode b(2); TreeNode c(5); TreeNode d(3); TreeNode e(4); TreeNode f(6); a.left =&b; a.right =&c; b.left =&d; b.right =&e; c.right = &f; //preorder(&a,0); preorder2(&a); return 0;}




这篇关于网易在线笔试牛牛的背包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/243551

相关文章

嵌入式软件常见的笔试题(c)

找工作的事情告一段落,现在把一些公司常见的笔试题型整理一下,本人主要是找嵌入式软件方面的工作,笔试的也主要是C语言、数据结构,大体上都比较基础,但是得早作准备,才会占得先机。   1:整型数求反 2:字符串求反,字符串加密,越界问题 3:字符串逆序,两端对调;字符串逆序,指针法 4:递归求n! 5:不用库函数,比较两个字符串的大小 6:求0-3000中含有9和2的全部数之和 7

轻量级在线服装3D定制引擎Myway简介

我写的面向web元宇宙轻量级系列引擎中的另外一个,在线3D定制引擎Myway 3D。 用于在线商品定制,比如个性化服装的定制、日常用品(如杯子)、家装(被套)等物品的在线定制。 特性列表: 可更换衣服款式,按需定制更换模型可实时更改材质颜色可实时添加文本,并可实时修改大小、颜色和角度,支持自定义字体可实时添加艺术图标,并可实时修改大小、颜色和角度,支持翻转、各种对齐可更改衣服图案,按需求定制

在线装修管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,装修队管理,用户管理,装修管理,基础数据管理,论坛管理 前台账户功能包括:系统首页,个人中心,公告信息,论坛,装修,装修队 开发系统:Windows 架构模式:B/S JDK版本:Java JDK1.8 开发工具:IDEA(推荐) 数据库版本: mysql5.7 数据库可视化工具: navicat 服务器:SpringBoot自带 ap

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

DDei在线设计器-API-DDeiSheet

DDeiSheet   DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。   DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。   一个DDeiFile实例至少包含一个DDeiSheet实例。   本篇最后提供的示例可以在DDei文档直接预览 属性 属性名说明数

比较学习难度:Adobe Illustrator、Photoshop和新兴在线设计平台

从入门设计开始,几乎没有人不知道 Adobe 公司两大设计软件:Adobe Illustrator和 Photoshop。虽然AI和PS很有名,有一定设计经验的设计师可以在早期探索和使用后大致了解AI和PS的区别,但似乎很少有人会系统地比较AI和PS。目前,设计软件功能多样,轻量级和网页设计软件已成为许多设计师的需求。对于初学者来说,一篇有针对性的AI和PS比较总结文章具有非常重要的指导意义。毕竟

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学

电压互感器在线监测的原理

电压互感器在线监测的原理主要基于电磁感应、电场效应以及一系列先进的监测技术。以下是对其原理的详细解释: 一、电磁感应原理 电压互感器(Voltage Transformer,简称VT)本质上是一种降压变压器,它利用电磁感应的原理将高电压信号转换成低电压信号以便于测量和监测。具体来说,电压互感器包含两个主要线圈:主线圈和次级线圈。主线圈接在被测电路中,当交流电压通过主线圈时,会在其内部产生磁场。

采药问题 01背包

Description:辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

计算广告:第三章——在线广告产品概览

第三章——在线广告产品概览 一、商业产品的设计原则 二、需求方层级组织及接口 二、供给方管理接口 (1)合约广告产品——主要服务于后续效果不宜直接衡量的品牌类广告主 按时段售卖的CPT广告按约定展示量售卖的CPM广告   (2)竞价广告产品 其形式主要是搜索广告,其产品形式为对搜索关键词的竞价。这种广告拓展到站外广告时,演变为了对页面关键词或者用户标签竞价的产品形式,也就是