经典算法题--动态规划分析背包能不能装满

输入第一行是两个数字,N(1<=N<=100)和M(1<=M<=1000)表示现有N件物品,和一个最多只能装M千克物品的背包
第二行是N个物品每个的重量

现判断N件物品中,能否恰好选出合适重量的物品,正好把背包装满。能则返回YES,不能返回NO
 1 N,M = list(map(int,input().strip().split(' ')))
 2 w = list(map(int,input().strip().split(' ')))
 3 dp = [[0 for i in range(M+1)] for _ in range(N+1)]
 4 for i in range(1,N+1):
 5     for j in range(1,M+1):
 6         #如果第i件体积为w[i-1]的物品可以放进体积为j的背包中
 7         if j >= w[i-1]:
 8             dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i-1]+w[i-1]])
 9         #如果第i件物品不能放进体积为j的背包中
10         else:
11             dp[i][j] = dp[i-1][j]
12         if dp[i][j] == M:
13             print('YES')
14 
15 print('NO')

 

本质上,动态规划的理念就是制作一个M列N行的表格,数据结构化后即为一个二元数组

posted @ 2021-12-01 00:08  大西young  阅读(121)  评论(0编辑  收藏  举报