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

专业网站建设首选公司重庆建设工程信息网加密狗无法登陆

专业网站建设首选公司,重庆建设工程信息网加密狗无法登陆,网站开发项目中的rd,网络公司发生网站建设费分录背包问题 01背包、完全背包、多重背包主要区别在于物品数量:01背包每个物品只有一个,完全背包物品有无限个,多重背包每个物品数量不同。 dp[i][j]表示编号[0,i]的物品任取放入容量为j的背包后,背包里物品的最大价值。 01背包问…

背包问题

01背包、完全背包、多重背包主要区别在于物品数量:01背包每个物品只有一个,完全背包物品有无限个,多重背包每个物品数量不同。

dp[i][j]表示编号[0,i]的物品任取放入容量为j的背包后,背包里物品的最大价值。

01背包问题 二维

#include <iostream>
#include <vector>
using namespace std;int bag(vector<int>& space, vector<int>& value, int m, int n){// dp[i][j]表示在[0,i]物品任选,装入容量为j的背包的最大价值vector<vector<int>> dp(m, vector<int>(n+1));for(int j=space[0];j<=n;j++){dp[0][j] = value[0];// 初始化将物品0装入背包}for(int i=1;i<m;i++){for(int j=0;j<=n;j++){if(j<space[i]){// 容量不够装入第i个物品dp[i][j] = dp[i-1][j];}else{// 装入i vs 不装入idp[i][j] = max(dp[i-1][j], dp[i-1][j-space[i]]+value[i]);}}}return dp[m-1][n];
}int main(){int m, n;cin>>m>>n;vector<int> space(m);vector<int> value(m);for(int i = 0;i<m;i++){cin>>space[i];}for(int i = 0;i<m;i++){cin>>value[i];}int res;res = bag(space, value, m, n);cout<< res <<endl;return 0;
}

①dp[i][j]表示在[0,i]物品中任选,装入容量为j的背包中获得的最大价值。

②对于每次选择只会存在两种结果:一是选择将物品i放入背包,二是将物品i不放入背包。放不放物品是根据价值来判断,因此,递推公式:dp[i][j]=max(dp[i-1][j], dp[i-1][j-space[i]]+value[i]),其中dp[i-1][j]表示不放入物品i,dp[i-1][j-space[i]]+value[i]表示放入物品i,j-space[j]表示腾出放入i的空间。

③初始化仅放入物品0的情况,只要容量大于物品0需要的空间,就选择放入物品0。

④遍历顺序从物品0遍历到物品m-1,背包容量从0到n。

01背包问题 一维

int bag(vector<int>& space, vector<int>& value, int m, int n){// dp[j]表示装入容量为j的背包的最大价值vector<int> dp(n+1);for(int i=0;i<m;i++){for(int j=n;j>=space[i];j--){// 装入i vs 不装入idp[j] = max(dp[j], dp[j-space[i]]+value[i]);}}return dp[n];
}

一维背包主要是在之前二维背包的基础上,将二维dp数组压缩成一维dp数组,在二维dp数组的递推公式中,dp[i][j]里,i都依赖与i-1的值,因此可以将i-1的值都拷贝到i,以此压缩数组。基本思路如下:

①dp[j]表示容量为j的背包可装的最大价值。

②与二维类似,存在两种选择,放入物品和不放入物品。不放入物品的最大价值是:dp[j],不放入物品:dp[j-space[i]]+value[i]。

③初始化:背包容量为0的时候,dp[0]=0。

④遍历顺序需要从后往前遍历。假设背包容量5,物品3种,space=[1,3,4],value=[15,20,30]。对于物品0,如果正序遍历:

dp[1] = dp[1 - weight[0]] + value[0] = dp[0] + 15 = 15

dp[2] = dp[2 - weight[0]] + value[0] = dp[1] + 15 = 30

此时dp[2]就已经是30了,意味着物品0,被放入了两次,所以不能正序遍历。如果倒序遍历:

dp[2] = dp[2 - weight[0]] + value[0] = dp[1] + 15

dp[1] = dp[1 - weight[0]] + value[0] = dp[0] + 15

所以从后往前循环,每次取得状态不会和之前取得状态重合,这样每种物品就只取一次了。

416. 分割等和子集(中等)

class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;for (int num : nums) {sum += num;}if (sum % 2) {return false;}// 相当于背包容量为sum/2vector<int> dp(sum / 2 + 1);for (int i = 0; i < nums.size(); i++) {for (int j = sum / 2; j >= nums[i]; j--) {dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);}}if (dp[sum / 2] == sum / 2)return true;elsereturn false;}
};

本题难度中等。本题为01背包的应用,将数组分为两个相等的子集,先计算sum,可以看作背包容量为sum/2,需要使用nums的数字装满背包,且数字的价值和重量相同。最后判断一下容量为sum/2所装最大价值是不是sum/2。

http://www.dtcms.com/a/592349.html

相关文章:

  • 营销型企业网站的建设方案在线制作成品图片
  • 永久免费的网站宣传策划方案
  • 超炫网站模板公司网络组建工作方案
  • asp网站源码 生成静态推荐专业做网站公司
  • 平度做网站推广深圳建站网站公司
  • phpcms 企业网站wordpress上传vps后安装
  • 营销型网站开发方案上海门户网站建设
  • asp建站系统源码wordpress添加cnzz
  • 宝安公司免费网站建设导航网站头部代码
  • 河北黄骅市网站建设海口双语网站建设
  • 华为企业建设网站的目的关系网站优化公司
  • 金山区做网站公司聊城 网站建设
  • 广州网站快速排名优化网站负责人
  • 合肥在线网站wordpress 科技主题
  • 科威网络做网站怎么样南山网站建设哪家效益快
  • cms建站是什么手机网站自助
  • 网站建设丨找王科杰上词快免费注册126邮箱
  • 网站开发需求问卷餐饮店会员卡管理系统
  • 网站开发神器企业整合营销系统
  • 莘庄做网站wordpress屏蔽评论
  • 电子商务网站建设合同签订wordpress收录提交插件
  • 网站sem怎么做购物网站数据分析
  • 自助建网站平台怎么收费安卓优化大师
  • 做公司网站协议书模板下载英文 网站 字体
  • 大厂做网站shijuewang杭州网站开发凡客
  • 在什么网站下载wordpress宝坻网站建设制作
  • 信阳住房和城乡建设局网站进入wordpress后
  • 涉县网站开发网站设计说明范文
  • 新手学做网站电子版东莞百度代做网站联系方式
  • 网站首页图片大小杭州如何做百度的网站