题目:


分析:这是一道01背包问题,有一个限制条件就是附件必须要在主件购买的前提下才能购买。本题的总钱数就类似于背包问题中的总重量,价格与重要度乘积的总和就类似于背包问题中的价值。定义数组dp[i][j]表示前i件物品花费j所得到的最大价值,对于每件物品可以选择放或者不放,具体:
(1)如果j<price[i-1](第i件物品的价格),则不能放入,dp[i][j]=dp[i-1][j];
(2)如果j>=price[i-1],那么可以选择放或者不放,分别对于转移方程:dp[i][j]=dp[i-1][j-price[i-1]]+v[i],dp[i][j]=dp[i-1][j];取两者中较大值,即
dp[i][j]=max{dp[i-1][j-price[i-1]]+v[i],dp[i][j]=dp[i-1][j]}。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int N = scanner.nextInt();
int m= scanner.nextInt

这是一道关于01背包问题的动态规划题目,重点在于处理附件必须随主件购买的条件。通过定义dp[i][j]表示前i件物品花费j所得到的最大价值,利用转移方程求解,当j小于第i件物品价格时不能选择,否则可以在放或不放之间选择,取两者中价值较大者。
最低0.47元/天 解锁文章
657

被折叠的 条评论
为什么被折叠?



