礼物问题动态规划代码

问题描述:

思路分析:

python代码求解:

import numpy as np
import pandas as pd
# l为单个礼物矩阵
l = np.array([[5, 3, 5, 1], [1, 5, 3, 5], [4, 2, 1, 1], [1, 5, 1, 3], [1, 5, 3, 4]])
def f(M):
    ## 计算礼物最大累加值
    FF = np.copy(M)
    # 获取行数和列数
    row = len(l)
    col = len(l[0])
    # 计算出M中第一行和第一列礼物的累加和(即确定边界条件)
    FF[:, 0] = np.cumsum(M[:, 0])
    FF[0, :] = np.cumsum(M[0, :])
    # 每一个礼物的近邻路境要么为上面下来的,要么为左边过来的(依次遍历,解决动态规划子问题)
    for i in range(1, row):
        for j in range(1, col):
            tem1 = FF[i, j-1] + M[i, j]
            tem2 = FF[i-1, j] + M[i, j]
            FF[i, j] = max(tem1, tem2) # 选择上面和左面最大的礼物作为路径来源
    # 输出最大礼物累加和
    f = FF[row-1, col-1]
    
    ## 获取最大礼物累加和的路径
    IND = [[0 for _ in range(col)] for _ in range(row)]
    IND[-1][-1] = 1
    # 先用FF-M对应位置处的值(FF为礼物累加和矩阵,M为单个礼物矩阵)记为cha,
    # 寻找FF上面或下面为cha的位置,使IND对应的位置为1并使行或列减1,循环此过程直到行和列都为初始位置
    while row != 0 and col != 0:
        temp1 = M[row-1][col-1]
        temp2 = FF[row-1][col-1]
        cha = temp2 - temp1
        if FF[row-2][col-1] == cha:
            IND[row-2][col-1] = 1
            row -= 1
        elif FF[row - 1][col - 2] == cha:
            IND[row-1][col-2] = 1
            col -= 1
        else:
            break
    df = pd.DataFrame(IND) # 转为dataframe型数据
    return f, IND, df
f, IND, df = f(l)
print(f)
print(IND)
print(df)


#注:此题图片及思路来源于数学建模清风,如有侵权请告知
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值