您的位置:首页 > 房产 > 建筑 > 网页设计实训报告技术难点_房产中介网站源码_互联网营销是干什么_网络营销团队

网页设计实训报告技术难点_房产中介网站源码_互联网营销是干什么_网络营销团队

2025/7/18 18:56:05 来源:https://blog.csdn.net/2301_80136323/article/details/146989410  浏览:    关键词:网页设计实训报告技术难点_房产中介网站源码_互联网营销是干什么_网络营销团队
网页设计实训报告技术难点_房产中介网站源码_互联网营销是干什么_网络营销团队

1. 01 背包(每种物品只能选一次)

思路:

  • 每个物品只能取 0 次或 1 次,求在容量限制内的最大价值。

  • 定义 dp[j] 表示容量 j 时的最大价值。

  • 遍历物品,从后向前遍历容量,防止物品被重复使用。

  • 状态转移方程: dp[j] = max(dp[j], dp[j - w[i]] + v[i])

代码模板:

for (int i = 0; i < N; i++) {  // 遍历物品for (int j = V; j >= w[i]; j--) {  // 倒序遍历背包容量dp[j] = Math.max(dp[j], dp[j - w[i]] + v[i]);}
}

示例: 输入:

3 5
2 3
1 2
3 4

计算过程:

  1. 初始化 dp = [0, 0, 0, 0, 0, 0]

  2. 处理第一个物品(重量2,价值3):

    • dp[5] = max(dp[5], dp[3] + 3) = 3

    • dp[4] = max(dp[4], dp[2] + 3) = 3

    • dp[3] = max(dp[3], dp[1] + 3) = 3

    • dp[2] = max(dp[2], dp[0] + 3) = 3

  3. 处理第二个物品(重量1,价值2),依次更新。

  4. 处理第三个物品(重量3,价值4),依次更新。

最终 dp[5] = 5


2. 完全背包(每种物品可以选无限次)

思路:

  • 每个物品可以取无限次。

  • 仍然定义 dp[j],但这次要正序遍历容量。

  • 状态转移方程: dp[j] = max(dp[j], dp[j - w[i]] + v[i])

代码模板:

for (int i = 0; i < N; i++) {  // 遍历物品for (int j = w[i]; j <= V; j++) {  // 正序遍历背包容量dp[j] = Math.max(dp[j], dp[j - w[i]] + v[i]);}
}

示例: 输入:

2 4
1 2
2 4

计算过程:

  1. 初始化 dp = [0, 0, 0, 0, 0]

  2. 处理第一个物品(重量1,价值2):

    • dp[1] = 2, dp[2] = 4, dp[3] = 6, dp[4] = 8

  3. 处理第二个物品(重量2,价值4):

    • dp[2] = 4(不变),dp[3] = 6(不变),dp[4] = 8(不变)

最终 dp[4] = 8


3. 多重背包(每种物品最多选 Si 次)

思路:

  • 直接按照 01 背包 方式处理的时间复杂度较高。

  • 使用 二进制拆分优化,将 s[i] 个物品拆分成若干个 2^k 份,使得 2^0 + 2^1 + ... 覆盖 s[i]

  • 状态转移方程: dp[j] = max(dp[j], dp[j - k * w[i]] + k * v[i])

代码模板(使用二进制优化):

for (int i = 0; i < N; i++) {  // 遍历物品int count = s[i];for (int k = 1; count > 0; k *= 2) {  // 二进制拆分int num = Math.min(k, count);count -= num;int weight = num * w[i];int value = num * v[i];for (int j = V; j >= weight; j--) {  // 01 背包处理dp[j] = Math.max(dp[j], dp[j - weight] + value);}}
}

示例: 输入:

3 10
2 3 3
3 4 2
5 6 2

计算过程(使用二进制优化拆分):

  1. 物品1(重量2,价值3,最多选3次)拆分成 1, 2

    • dp[10] = max(dp[10], dp[8] + 3)

    • dp[8] = max(dp[8], dp[6] + 3)

    • 依次更新 dp[2] = 3, dp[4] = 6, dp[6] = 9

  2. 物品2(重量3,价值4,最多选2次)拆分成 1, 1

    • 依次更新 dp[3] = 4, dp[6] = 8, dp[9] = 12

  3. 物品3(重量5,价值6,最多选2次)拆分成 1, 1

    • dp[5] = 6, dp[10] = 12

最终 dp[10] = 12


总结:

  • 01 背包: 只能选 0 或 1 次,倒序遍历容量。

  • 完全背包: 可选无限次,正序遍历容量。

  • 多重背包: 每种物品最多选 Si 次,二进制拆分优化

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com