给出n个物体,第i个物体重量为w_i.选择尽量多的物体,使得总重量不超过C.其中参数n为正整数,w_i,C为正的有理数。 输入格式: 第一行输入n和C,用空格隔开。 第二行输入w_1, w_2 ...w_n.共n个数,用空格隔开。 输出格式: 第一行输出选择的物体数量。 第二行按从小到大的顺序输出选择的物体编号i。 注:如果物体数量相同有多种选择,请输出物体重量和最小的物体编号。
时间: 2023-04-12 22:00:30 浏览: 175
C知道:这是一个经典的背包问题,可以使用动态规划来解决。首先定义一个二维数组dp[i][j],表示前i个物体中选择总重量不超过j的最大价值。则状态转移方程为:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + 1)
其中,dp[i-1][j]表示不选择第i个物体的情况下的最大价值,dp[i-1][j-w[i]] + 1表示选择第i个物体的情况下的最大价值,其中+1表示选择了一个物体。
最终的答案即为dp[n][C],选择的物体可以通过回溯dp数组得到。具体实现可以参考以下代码:
n, C = map(float, input().split())
w = list(map(float, input().split()))
dp = [[0 for j in range(int(C)+1)] for i in range(len(w)+1)]
for i in range(1, len(w)+1):
for j in range(1, int(C)+1):
if j >= w[i-1]:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-int(w[i-1])] + 1)
else:
dp[i][j] = dp[i-1][j]
# 回溯dp数组得到选择的物体
res = []
i, j = len(w), int(C)
while i > 0 and j > 0:
if dp[i][j] != dp[i-1][j]:
res.append(i-1)
j -= int(w[i-1])
i -= 1
res.reverse()
print(len(res))
print(" ".join(str(x) for x in res))
阅读全文