机器分配-分组背包&&线性动态规划

动态规划,且学且放弃 文章目录背包问题01背包01背包的空间优化问题 最近准备把dp完完整整的复习一遍,开博记录 背包问题 01背包 01背包的空间优化问题 可以空间优化的根本原因: 第i个状态仅能转移到i-1个 即当一层状态更新完毕,就不会影响其余的状态 如果正向枚举 不满足此性质 ... 阅读详情

题目描述

某总公司拥有高效生产设备M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为总公司提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。 分配原则:每个公司有权获得任意数目的设备,但总台数不得超过总设备数M。其中M<=100,N<=100。

输入

第一行为两个整数M,N。接下来是一个N×M的矩阵,其中矩阵的第i行的第j列的数Aij表明第i个公司分配j台机器的盈利。所有数据之间用一个空格分隔。

输出

只有一个数据,为总公司分配这M台设备所获得的最大盈利。

样例输入

3 2
1 2 3
2 3 4

样例输出

4

解题思路

解法一(线性dp):每个公司只能选一种分配方式,使用线性dp,前 i 个公司分配 j 个机器的最大利润等于前i-1个公司的各种状态下分配给第i个公司k个机器的最大值。

解法二(分组背包):第k个公司分i台机器当成物品,那么一共有n*m个物品。一个公司的分配1-m台机器的m种情况当成一组物品,这一组物品相互排斥,要么选一个要么不选,符合分组背包的特点。分i台机器,消耗i个体积,获得的价值就是公司盈利,背包容量就是总共的m台机器。这里提供一维和二维两种存dp的代码。

解法一代码

#include<cstdio>
#include<iostream>
using namespace std;
int a[110][110];
int f[110][110];//f表示前i个公司分配j个机器所获得的最大利益
int main()
{
    int m,n,i,j,k;//k表示给第i个公司分配k个机器
    scanf("%d%d",&m,&n);
    for(i=1;i<=n;++i)
    {
        for(j=1;j<=m;++j)
            scanf("%d",&a[i][j]);
    }

    for(i=1;i<=n;++i)
    {
        for(j=1;j<=m;++j)
        {
            for(k=0;k<=j;++k)//由哪种状态分配给第i公司k个机器,使得前i个公司分配得到j个机器f[i][j]的值最大
            {
                if(f[i-1][j-k]+a[i][k]>f[i][j])
                    f[i][j]=f[i-1][j-k]+a[i][k];
            }
        }
    }
    printf("%d",f[n][m]);
    return 0;
}


解法二代码1(1维数组存最大价值,可以先看下面2维的理解一下):

#include <iostream>
#include <cstdio>

using namespace std;

bool vist[110][110];
int main()
{
    int n,m,i,j;//m台机器表示背包容量
    int v[101][101]={0};//每个公司分几个机器的利益表示物品价值
    int dp[110]={0};//这里初始化的时候 int p[110]={};括号里不写值是不对的!!

    scanf("%d%d",&m,&n);

    for(i=1;i<=n;++i)
    {
        for(j=1;j<=m;++j)
            scanf("%d",&v[i][j]);//i件物品的价值
    }

    int k;//k组,一个公司一组
    for(k=1;k<=n;++k)
        for(j=m;j>=0;--j)//前【k】个公司分【j】个机器 j相当于体积v
            for(i=0;i<=m;++i)//给第k个公司分i个机器,i属于组k
                if(j>=i && dp[j]< dp[j-i]+v[k][i])//前k-1个公司要少分i个机器,才能给第k个公司分配i个机器
                    dp[j]=dp[j-i]+v[k][i];

    printf("%d",dp[m]);
    return 0;
}


解法二代码2(2维数组存最大价值):

我写的有错误,求大神们找bug。。。。

终于找到bug了,数组v定义的时候应该开>100的,因为我的数组从v【1,1】开始的。。。

#include <iostream>
#include <cstdio>
using namespace std;

int v[110][110]={0}; //v表示价值
int dp[110][110]={0};


int main()
{
    int n,m,i,j;//m表示背包容量

    scanf("%d%d",&m,&n);

    for(i=1;i<=n;++i)
    {
        for(j=1;j<=m;++j)
            scanf("%d",&v[i][j]);//i件物品的价值
    }
    int k;
    for(k=1;k<=n;++k)
        for(j=m;j>=0;--j)
        {
            int temp=dp[k-1][j];
            for(i=0;i<=j;++i)
            {
                if(dp[k-1][j-i]+v[k][i]>temp)
                    temp = dp[k-1][j-i]+v[k][i];
            }
            dp[k][j]=temp;
        }

    printf("%d",dp[n][m]);
    return 0;
}


动态规划——机器分配、01背包问题 总公司有n个分公司,现在有m台设备可以分配给这些分公司。每个分公司i如果得到j台设备,会产生一定的盈利a[i][j]。任务是找到一个分配方案,使得所有分公司获得的盈利总和最大。我们定义一个二维数组f,其中f[i][j]表示前i个分公司分配j台设备时的最大盈利。注意,这里我们是从1开始索引的,所以f[1][0]表示第一个分公司没有分配到设备时的盈利(通常是0,因为没有设备就没有盈利)。 阅读详情

相关推荐

动态规划之【背包DP】第16课:分组背包DP应用案例实践3

动态规划之【背包DP】第16课:分组背包DP应用案例实践3

王老师青少年编程 539

C++---背包模型---机器分配(每日一道算法2023.3.18)

总公司拥有 M台 相同 的高效设备,准备分给下属的 N个分公司。 各分公司若获得这些设备,可以为国家提供一定的盈利。盈利与分配的设备数量有关。 问:如何分配这M台设备才能使国家得到的盈利最大? **求出最大盈利值。** 分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数 M。

SRestia的博客 809

一本通 1266

总公司拥有高效设备M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?其中M≤15,N≤10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。虽然是水题,恰巧写一下这种类似背包输出具体方案的。

chromosome24k的博客 304

#分组背包 #背包方案 ——Acwing 1013 机器分配

总公司拥有M台 相同 的高效设备,准备分给下属的N个分公司。 各分公司若获得这些设备,可以为国家提供一定的盈利。盈利与分配的设备数量有关。 问:如何分配这M台设备才能使国家得到的盈利最大? 求出最大盈利值。 分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。 输入格式 第一行有两个数,第一个数是分公司数N,第二个数是设备台数M; 接下来是一个N*M的矩阵,矩阵中的第 i 行第 j 列的整数表示第 i 个公司分配 j 台机器时的盈利。 输出格式 第一行输出最大盈利值; 接下N行,每行有2个数,

仅仅是笔记。 387

【题解】机器分配DP

题面 【题目描述】 总公司拥有高设备MMM台,准备分给下属的NNN个分公司。各分公司获得这些设备,可以为国家提供一定的盈利。问:如何分配这MMM台设备才能使国家得到的盈利最大?求出最大盈利值。其中M≤15,N≤10M\leq 15,N\leq 10M≤15,N≤10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数MMM。 【输入】 第111行有两个数,第111个数是分公司数NNN,...

_BOSS_的博客 940

动态规划常见类型总结

本文针对动态规划的常见类型进行总结。虽说总结的是动态规划,但顺便把递推也放了进来。严格来说,递推不属于动态规划问题,因为动态规划不仅有递推过程,还要有决策(即取最优),但广义的动态规划是可以包含递推的,递推是一类简单的、特殊的动态规划,毕竟动态规划与递推密不可分。动态规划类型主要分为纯粹动态规划问题和复合动态规划问题。 几点说明: 1、博主本人于2012年对信息学竞赛中的动态规划问题进行了总结...

FanJin的博客 2万+

分组背包、混合背包复习打卡

思路:分组背包+路径遍历。

Angus5201314的博客 120

Acwing算法—动态规划

目录 数字三角形模型AcWing 898. 数字三角形AcWing 1015. 摘花生AcWing 1018. 最低通行费AcWing 1027. 方格取数AcWing 275. 传纸条最长上升子序列模型AcWing 895. 最长上升子序列AcWing 896. 最长上升子序列 IIAcWing 1017. 怪盗基德的滑翔翼AcWing 1014. 登山AcWing 482. 合唱队形AcWing 1012. 友好城市AcWing 1016. 最大上升子序列和AcWing 1010. 拦截导弹AcWing

HENRYyangtuo的博客 5616

力扣 2463. 最小移动总距离 —— 动态规划 & 贪心排序全解(Java 实现)

动态规划与贪心算法结合的面试题库中,LeetCode 2463 最小移动总距离是一道极具代表性的经典难题。它以「X 轴上机器人与工厂的最优匹配」为目标,既不依赖复杂数学推导,也不涉及冷门数据结构,却精准考察了贪心排序思想、状态定义设计、分组背包模型转化以及空间优化四大核心能力。看似简单的机器分配问题,背后藏着从暴力枚举到最优子结构的完整算法演进逻辑,也是面试官常用来检验算法思维是否严谨的高频考题。

l7_yuqi的博客 566

常用算法代码模板与题单 | E - 动态规划(更新于2026.8.2)

这篇文档其实是我自己学习路上的一份“复习笔记”。之前看了不少教程,零零散散记了一堆代码片段和小技巧,时间久了就容易忘,翻起来也麻烦。所以干脆花时间整理了一下,把常用的模板、容易踩的坑、还有一些个人觉得挺实用的小技巧都归到了一起。 如果你也在学类似的东西,或许能帮你省下一些翻找的时间;如果有哪里写得不清楚或不对,也欢迎随时指正交流。 希望这份整理也能对你有一点点帮助~ ✨

团爸讲算法 242

动态规划解决资源分配问题:从理论到代码实战

资源分配是计算机科学和运筹学中的经典优化问题,其核心是在有限资源与多样需求间寻求最优解。动态规划作为解决此类问题的关键技术,通过将复杂问题分解为重叠子问题并利用最优子结构性质,避免了组合爆炸。其核心在于状态定义与转移方程的设计,例如使用dp[i][j]表示将j单位资源分配给前i个活动的最大收益。该技术具有极高的工程价值,广泛应用于项目投资、服务器调度、时间管理等场景。本文以资源分配为切入点,深入剖析动态规划的原理与实现,涵盖二维DP、一维滚动数组优化及方案回溯等实战细节,为算法学习和工程优化提供清晰指南。

weixin_30325971的博客 304

基础动态规划问题(1)

状态表示不需要发生改变, 因为物品数量是无限的, 状态转移方式需要改变, 对于当前物品可选择的次数上限是。方案可以由当前物品的选择情况进行划分, 如果不选择当前物品。, 的选择方案中价值最大的方案的价值, 对于。, 因此也可以优化掉一维, 但是因为当前状态。代替状态表示, 但是第二层体积需要进行。背包问题的状态转移方程, 因为。, 如果选择当前物品价值就是。状态, 只能正序枚举体积。个物品, 总体积不超过。, 需要的上一层状态是。, 状态转移方程优化为。, 因为当前状态是由。, 因为对于当前状态。

Ayanami_Rei的博客 503

动态规划--from zpz

版权声明:copy from zpz,我可能要修改 https://blog.csdn.net/qq_40828060/article/details/83064425 文章目录前言记忆化搜索动态规划的基本解题思路背包问题01背包(待处理)P1489 猫狗大战01背...

lengxuenong的博客 1162

动态规划

动态规划题目整理笔记

悖论BL的博客 770

动态规划(Dynamic Programming,DP)是数学、计算机科学和运筹学中的一个分支

动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等;最短路径问题 ,项目管理,网络流优化等;

[Blog][Domain] programb.blog.csdn.net 392

ACM - DP - 提高1 (数字三角形 / 方格 + 最长上升子序列 + 背包

这里写目录标题一、数字三角形模型:只能朝右或下走1、AcWing 1018. 最低通行费:只走一次2、AcWing 1027. 方格取数:走两次,只拿一次,且可重复3、AcWing 275. 传纸条:走两次,只拿一次,且不可重复二、最长上升子序列模型1、AcWing 1014. 登山:既上山又下山2、AcWing 1012. 友好城市:线性互不交叉3、AcWing 1016. 最大上升子序列和4、AcWing 1010. 拦截导弹:最长上升子序列 == 最少用多少个非上升子序列才能填满整个序列(反之亦然)5

CSDNWudanna的博客 672

2024秋招小米算法岗笔试复盘:从KMP到树形背包的实战指南

算法岗笔试是秋招的重要关卡,扎实的数据结构与算法基础是应对各类编程题的前提。KMP字符串匹配算法和动态规划是笔试中的高频考点,前者考察对next数组推导的准确理解,后者则常以背包问题变形出现,需要掌握状态设计与复杂度优化。深入理解这些经典算法的原理与技术价值,能帮助候选人在有限时间内高效解题。在实际笔试场景中,排序算法稳定性、机器学习理论与深度学习基础也常以选择题形式出现。以2024年小米算法岗第二批笔试为例,完整复盘了从收到通知到交卷的全过程,梳理了KMP、动态规划、树形依赖背包机器学习、智能优化算法等

weixin_33804582的博客 568

DP题单

背包 不了解背包问题请看这儿 01背包问题 完全背包问题 多重背包问题 多重背包问题 II 分组背包问题 线性DP 数字三角形 最长上升子序列 (题解) 最长上升子序列 II (题解) 最长公共子序列 (题解) 最短编辑距离 (题解) 编辑距离 (题解) 区间DP 石子合并 (题解) 状态压缩DP 蒙德里安的梦想 (题解) 最短Hamilton路径 (题解) 树形DP 没有上司的舞会 (题解) 记忆化搜索 滑雪 (题解) ...

qq_50702668的博客 344
上一篇: 奶牛的锻炼-线性dp
下一篇: 尼克的任务-线性dp
lyyy.
博客等级 码龄11年 168粉丝 236原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值