用C语言实现如下问题:现有n种物品和一个可承载M 重量的背包,n种物品的重量分别为(w 1 , w 2 , …, w n ),n种物品放入背包所获得的效益分别是(p 1 , p 2 , …, p n ) (p i >0),p i 和w i 均是正整数,若将物品i的一部分x i (0<=x i <=1)放入背包,则所获得的效益是p i x i ,问采用怎样的装包方法会使装入背包物品的总效益为最大? 输入格式: 第1行是M和n,表示背包容量为M且有n件物品; 第2行是这n件物品的重量w i ; 第3行是各物品的价值p i 。 输出格式: 第1行是所选物品的最大价值之和; 第2行是各物品装入背包的量x i 。要求保留小数点后两位,第三位按照四舍五入处理。 输入样例1: 20 3 18 15 10 25 24 15 输出样例1: 31.5 0.00 1.00 0.50 输入样例2: 100 10 13 2 10 50 1 28 37 32 30 46 129 238 370 457 192 116 235 97 140 184 输出样例2: 1538.43 1.00 1.00 1.00 1.00 1.00 0.00 0.65 0.00 0.00 0.00
时间: 2024-03-07 17:52:05 浏览: 78
背包问题,C语言实现
这是一个经典的背包问题,可以使用动态规划求解。具体来说,定义 $f(i, j)$ 表示前 $i$ 个物品,放入容量为 $j$ 的背包中,所能获得的最大价值。则有以下状态转移方程:
$$
f(i, j) = \max \{f(i-1, j), f(i-1, j-w_i) + p_i \}
$$
其中 $w_i$ 和 $p_i$ 分别表示第 $i$ 个物品的重量和价值。
在计算完所有的 $f(i, j)$ 后,最大价值即为 $f(n, M)$。接下来需要计算各物品装入背包的量 $x_i$。可以定义 $g(i, j)$ 表示前 $i$ 个物品,放入容量为 $j$ 的背包中,物品 $i$ 装入的量。则有以下状态转移方程:
$$
g(i, j) = \begin{cases}
0, & j < w_i \\
\max(g(i-1,j), g(i-1, j-w_i) + x_i), & j \geq w_i
\end{cases}
$$
其中 $x_i$ 的值可以通过 $g(n, M)$ 回溯得到。
以下是具体的 C 语言实现:
阅读全文