D


私信TA

用户名:ALS1111

访问量:22109

签 名:

等  级
排  名 55
经  验 11377
参赛次数 0
文章发表 132
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:

参考博客https://blog.csdn.net/qq_52441682/article/details/122634449?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=2


动态规划。

假设法码个数为n,所能称的最大重量为w,建立一个大小为(n+1)*(w+1)的二维数组。初始化的值都为零。

dp[i][j],代表当有i个法码时是否能称出重量为j的物品,如果能,则令dp[i][j] = 1。

状态转移方程:

if dp[i-1][j]:

    dp[i][j] = 1       #第i个法码不放

    dp[i][j+m[i]] = 1    #第i个法码放在法码盘

    if j > m[i]:

    dp[i][j-m[i]]     #第i个法码放在物品盘


最后计算sum(dp[n])即可。


注意事项:

参考代码:

n = int(input())  
A = [int(i) for i in input().strip().split()]  
A.sort(reverse = True)  
A = [0] + A  
maxweight = sum(A)  
  
dp = [[0 for j in range(maxweight+1)] for i in range(n+1)]  
  
for i in range(n+1):  
    dp[i][0] = 1  
  
for i in range(1,n+1):  
    for j in range(maxweight+1):  
        if dp[i-1][j]:  
            dp[i][j] = 1  
            dp[i][j+A[i]] = 1  
            if j > A[i]:  
                dp[i][j-A[i]] = 1  
print(sum(dp[n])-1)


 

0.0分

12 人评分

  评论区

厉害,大佬。请问为什么A[]中的值,也就是砝码重量,必须要顺序从大到小?
我尝试从小到大结果就会错误

是因为从小到大的话,在后面大砝码的循环中,不会进入17行的判断中去了吗?
2022-02-13 00:52:57
  • «
  • 1
  • »