动态规划 python 挖矿问题

算法蝉翼
• 阅读 2412
#!/usr/bin/env python
# encoding: utf-8

import copy
def good(n,w,g=[],p=[]):
    # n为金矿数,w为人数,g为金矿数组,p为人数数组
    arr = [0]*w
    for i in range(w):
        if (i+1)>=p[0]:    # i为坐标, i+1为人数
            arr[i] = g[0]
    res = copy.deepcopy(arr)  #深copy
    print(res)
    # 上面为只有一个金矿的情况
    for i in range(1,n):      # 金矿数
        # 每一层代表前N个金矿人工数(1~10)人的解
        # 前一层已经求出相同人数时选取不同金矿的最大值所以可以叠加 
        for j in range(w):    # 人工数
            if (j+1)<p[i]:     # j为坐标, j+1为人数
                arr[j] = res[j]   #和上一次情况相同
            else:
                t = 0 if (j-p[i])<0 else j-p[i]    #防止负数取到后面的值
                arr[j] = max(res[j],res[t]+g[i])    #挖和不挖第i座金矿比较取大
                #res[t]+g[i] 为 挖第i座金矿的情况,res[已有人数 - 第i座所需人数]+第i座金子g[i]
        res = copy.deepcopy(arr)
        print(res)
    return res.pop()
 
if __name__ == '__main__':
    res = good(5,10,[400,500,200,300,350],[5,5,3,4,3])
点赞
收藏
评论区
推荐文章
DaLongggggg DaLongggggg
4年前
python刷题-数列特征
问题描述给出n个数,找出这n个数的最大值,最小值,和。输入格式第一行为整数n,表示数的个数。第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。输出格式输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。样例输入513245样例输出5211数据规模与约定1<n<10000。
Patrick Patrick
4年前
【分治法】解决中位数问题、格雷码问题以及分治法直接折半存在的问题讨论————武汉理工大学算法分析实验1
AlgorithmExperiment算法分析课实验分治法的核心思想是将问题分为若干子问题去,使规模一步步缩小,最终分到一步就能得出结果。要注意每个子问题需要性质相同而且相互不重复。采用分治法完成如下任务:i.中位数问题问题描述设X0:n1和Y0:n–1为两个数组,每个数组中含有n个已排好序的数。找出X和Y
Stella981 Stella981
3年前
25道Shell面试题
1、用sed修改test.txt的23行test为tset;sed–i‘23s/test/tset/g’test.txt2、查看/web.log第25行第三列的内容。sed–n‘25p’/web.log|cut–d“”–f3head–n25/web.log|tail–n1|
Stella981 Stella981
3年前
LeetCode 5561. 获取生成数组中的最大值
文章目录1\.题目2\.解题1\.题目给你一个整数n。按下述规则生成一个长度为n1的数组nums:nums00nums11当2<2i<n时,nums2inumsi
Wesley13 Wesley13
3年前
Java入门系列
这篇文章为你搞懂2个问题1.什么是数组,数组是干嘛用的?2.数组如何使用?考试结束后,老师给二狗安排了一项任务,统计班里40名同学的平均分。按照我们之前的做法,我们可以定义40个变量然后再相加除以40求出平均分,但是这样太繁琐了,有没有更好的办法呢?那就是使用数组。数组数组其实也是一个变量,顾名思义存储了一组相同类型的
Wesley13 Wesley13
3年前
Java排序算法之选择排序
1\.基本思想选择排序(selectsorting)的基本思想是:1)对于一个大小为n的数组,选择排序共执行n1轮排序2)每轮排序寻找到该轮最小的数放到开始位置上:先假定当前这个数是最小数然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,得到下标当遍历到数组的最
贾蔷 贾蔷
2个月前
洛谷P1255题 解题思路和步骤 C++实现带注释,c++入门基础题
一、问题描述与递推关系建立洛谷P1255数楼梯问题要求计算n级台阶的不同走法数,每次可以跨1级或2级。这本质上是斐波那契数列的变种问题,递推公式为f(n)f(n1)f(n2)。当n≤50时可用普通整型存储,但题目中n可能达到5000,这就必须使用高精度运
深度学习 深度学习
2个月前
洛谷P2034题解:动态规划+单调队列优化求解最大K段子段和问题
一、题目解读洛谷P2034题目要求给定一个长度为n的整数数组,将其分成不超过k段,求各段和的最大值。该问题属于经典动态规划问题的扩展,需结合优化技巧高效求解。二、解题思路采用动态规划单调队列优化的策略。核心思想是定义状态dp
贾蔷 贾蔷
1个月前
CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用
一、题目解读2019年的“纪念品”问题(对应P5662)要求玩家在T天内通过买卖纪念品最大化金币收益。每天可交易N种商品,需计算最优策略下的最终金币数。题目强调思维与资源分配优化,是中的经典题型。二、解题思路核心思路为“动态规划”。每天将当前商品价格与次
菜园前端 菜园前端
2年前
什么是动态规划?
原文链接:什么是动态规划?动态规划也是算法设计的一种方法/思想。它将一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原来的问题。基础案例场景一斐波那契数列当前数等于前面两个数的和。定义子问题:f(n)f(n1)f(n2)
贾蔷 贾蔷
3个月前
力扣1137题 解题思路和步骤 C++代码实现,力扣一共多少题
一、题目分析力扣1137题要求我们找到第N个泰波那契数。泰波那契数的定义是:T00,T11,T21,且在n0的条件下Tn3TnTn1Tn2。,当n4时,T4T3T2T14。这道题主要考查我们对递归或动态规划的理解和运用。在思考解题方法时,我们