给定一个最大载重量为M的卡车和N种食品,有食盐,白糖,大米等。已知第 i 种食品的最多拥有Wi 公斤,其商品价值为Vi元,编程确定一个装货方案,使得装入卡车中的所有物品总价值最大。
输入格式
输入只包括一个用例,第一行为两个正实数M,N(N<=100),分别表示卡车载重量和食品种数,接下来N行,每行两个正实数,分别表示第i食品的重量和价值。
输出格式
输出一含一个数,即装入卡车的最大价值,要求只保留两位小数。
输入样例
5 3
2 9
3 11
1 5
输出样例
21.33
问题描述:
给定一个最大载重量为M的卡车和N种食品,每种食品有重量和价值两个属性。已知第 i 种食品的最大重量为Wi公斤,其商品价值为Vi元。编写程序确定一个装货方案,使得装入卡车中的所有物品总价值最大。
输入格式:
输入只包括一个用例,第一行为两个正实数M,N(N<=100),分别表示卡车载重量和食品种数,接下来N行,每行两个正实数,分别表示第i食品的重量和价值。
输出格式:
输出一个数,即装入卡车的最大价值,要求保留两位小数。
输入样例:
5 3
2 9
3 11
1 5
输出样例:
21.33
解决方案:
这是一个经典的背包问题,可以使用动态规划来解决。
设dp[i][j]表示将前i种食品放入重量为j的背包中所能取得的最大总价值。因此,dp[i][j]的状态转移方程为:
如果第i种食品的重量wi大于背包的剩余重量j,则无法放入背包中,dp[i][j]等于前i-1种食品放入背包中的最大总价值,即dp[i][j] = dp[i-1][j]。
如果第i种食品的重量wi小于等于背包的剩余重量j,则可以选择放入或不放入背包中,取两者中的价值最大值。放入背包中时,总价值为dp[i-1][j-wi]加上第i种食品的价值vi。不放入背包中时,总价值为dp[i-1][j]。因此,dp[i][j]等于这两者中的较大值,即dp[i][j] = max(dp[i-1][j-wi] + vi, dp[i-1][j])。
可以使用一个二维数组dp来存储状态转移过程,同时需要遍历所有状态的组合来计算最大总价值。
以下是具体的解决方案代码:
def max_value(M, N, items):
dp = [[0.0] * (M+1) for _ in range(N+1)] # 初始化dp数组
for i in range(1, N+1):
for j in range(1, M+1):
weight = items[i-1][0] # 第i种食品的重量
value = items[i-1][1] # 第i种食品的价值
if weight > j:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j-weight] + value, dp[i-1][j])
return dp[N][M]
# 输入数据
M, N = map(int, input().split()) # 卡车载重量 M 和食品种数 N
items = [] # 食品列表
for _ in range(N):
weight, value = map(int, input().split())
items.append((weight, value))
# 计算最大总价值
result = max_value(M, N, items)
print('%.2f' % result)
以上代码使用Python编写,利用二维数组保存状态转移过程。最后输出结果时,使用'%.2f'格式将结果保留两位小数。