• python,满分,砝码称重【第十二届】【省赛】【研究生组】


    完整源代码在文章末尾,首先这种涉及到二维数组的优化问题,优先考虑动态规划

     核心思路:

    先构建一个二维python列表(详情参考(341条消息) python 二维列表(数组)赋值问题_z小白的博客-CSDN博客_python创建二维数组赋值

    (通过代码)

    然后再变成这样

    为什么这里要多一行,多一列呢?

    为了方便以下三个条件

            1.dp[i][j] = dp[i-1][j] or \#已经可以表示,这个i砝码不用放
            2.dp[i-1][abs(j-w[i-1])] or \#是重了吗?这个i砝码放在另一边,减重
            3.dp[i-1][j+w[i-1]]#是轻了吗?这个i砝码放在同一边,增重

    一、特别是第2个条件dp[i-1][abs(j-w[i-1])] 中的abs(j-w[i-1]),

    如题目测试样例:

    3

    1 4 6

    其中输入考虑1时,有dp[1][1] = dp[1 - 1][abs(1 - w[0])] = dp[1 - 1][abs(1 - 1)]= dp[0][0] = 1

    其中输入考虑4时,有dp[2][4] = dp[2 - 1][abs(4 - w[1])] = dp[2 - 1][abs(4 - 4)]= dp[1][0] = 1

    等,所以把第0列全部变为1,为了使这种情况成立,

    这个点的思路来源:当然实际不是一下得出来的,是调试出1和4都为0时候不对,才知道dp[0][0]=dp[1][0]是本该成立的要设置为1,

    二、对第三个条件dp[i-1][j+w[i-1]],当然为了避免地址越界,需要以下代码区分以下,即如果存在越界则该条件失效,否则考虑该条件,如下截图:

     这是主要的地方,其它的地方与动态规划类似,文章末尾有参考博客可以看一下。

    1. N = int(input())
    2. str1 = input()
    3. #权重矩阵
    4. w = []
    5. w = [int(x) for x in str1.split(" ")]
    6. sum = 0
    7. for x in w:
    8. sum += x
    9. #初始化result二维列表为0,
    10. dp = [[0]*(sum+1) for x in range(len(w)+1)]
    11. #更新result列表
    12. dp[0][0] = 1#初始
    13. for i in range(1,len(w)+1):
    14. dp[i][0] = 1#****************************
    15. for j in range(1,sum+1):
    16. #if主要针对dp[i-1][j+w[i-1]]这个条件,避免越界
    17. '''
    18. dp[i][j] = dp[i-1][j] or \#已经可以表示,这个i砝码不用放
    19.         dp[i-1][j-w[i-1]] or \#是重了吗?这个i砝码放在另一边,减重
    20.         dp[i-1][j+w[i-1]]#是轻了吗?这个i砝码放在同一边,增重
    21. '''
    22. if j + w[i-1] <= sum:
    23. dp[i][j] = dp[i-1][j] or \
    24. dp[i-1][abs(j-w[i-1])] or dp[i-1][j+w[i-1]]
    25. else:
    26. dp[i][j] = dp[i-1][j] or \
    27. dp[i-1][abs(j-w[i-1])]
    28. #print(dp)
    29. #更新完毕统计最后一行(除去第0列)1的个数,(由*号行知道,第0列全为1,只是为了规划这条语句dp[i-1][abs(j-w[i-1])使用,不作为参考)
    30. count = 0
    31. for i in range(1,sum+1):
    32. if dp[len(w)][i] == 1:
    33. count += 1
    34. print(count)

    参考的一位,c语言实现的:试题 历届真题 砝码称重【第十二届】【省赛】【B组】_LightningJie的博客-CSDN博客

  • 相关阅读:
    ​DPDK 高效原因初探
    PCB放置过孔技巧
    html、css学习记录【uniapp前奏】
    centos7安装cdh6.3.2-附带安装包
    LrC 13 & ACR 16:镜头模糊
    鲜花植物展示预约小程序的作用有哪些
    Linux:169.254.0.0/24路由的来龙去脉
    华为机试:粮油买卖
    业务实战记录(2):流失率统计逻辑误区
    Go和Java实现抽象工厂模式
  • 原文地址:https://blog.csdn.net/qq_47991812/article/details/127709406