#P15562. [CCPC 2025 哈尔滨站] 01 背包

[CCPC 2025 哈尔滨站] 01 背包

题目描述

01 背包问题是一个算法竞赛中经典的组合优化的问题,小 w 学会了一种求解该问题的贪心算法。01 背包问题的定义以及小 w 的贪心算法如下。

01 背包问题\textbf{01 背包问题}

给定 nn 个物品,物品的重量分别为正整数 w1,w2,,wnw_1,w_2,\ldots,w_n ,物品的价值分别为正整数 v1,v2,,vnv_1,v_2,\ldots,v_n,再给定背包容量 WW。要求 x1,x2,,xnx_1,x_2,\ldots,x_n (1in\forall 1 \le i \le n, xi{0,1}x_i \in \{0,1\}),满足:

i=1nwixiW\sum_{i=1}^n w_ix_i \le W

并最大化:

V=i=1nvixiV = \sum_{i=1}^n v_ix_i

贪心算法\textbf{贪心算法}

  1. nn 个物品按照 viwi\frac{v_i}{w_i} 的值从大到小排序,viwi\frac{v_i}{w_i} 相同则按照 wiw_i 从大到小排序。
  2. 设一初始置 0 的变量 W0W_0,并,并从 11nn 枚举 ii,如果 V0+wiWV_0+w_i \le W,则置 xi1,W0W0+wix_i \leftarrow 1, W_0 \leftarrow W_0 + w_i,否则置 xi0x_i \leftarrow 0
  3. 枚举完之后即可得到所求的 x1,x2,,xnx_1,x_2,\ldots,x_n 以及 VV

你当然知道这个算法是错误的,但小 w 并不相信。即使你给了小 w 一些反例,小 w 依然认为这个算法能在很多不同的 WW 下都能得到最优的 VV,所以你现在希望构造一组 w1,w2,,wnw_1,w_2,\ldots,w_n 以及 v1,v2,,vnv_1,v_2,\ldots,v_n 使得:

  1. 2WWlim\forall 2 \le W \le W_{lim}WlimW_{lim} 是一个给定的常数),小 w 的算法都无法得到最优的 VV
  2. 在满足条件 11 的情况下,nn 尽量小。
  3. 在满足条件 1,21,2 的情况下,max(w1,w2,,wn)\max(w_1,w_2,\ldots,w_n) 尽量小。
  4. 在满足条件 1,2,31,2,3 的情况下,max(v1,v2,,vn)\max(v_1,v_2,\ldots,v_n) 尽量小。

现在你需要构造一组满足上述条件的 01 背包来说服小 w,你能做到吗?如果构造方法有多种,你可以输出任意一种。

输入格式

输入共一行包含一个整数 WlimW_{lim} (2Wlim5×1032 \le W_{lim} \le 5 \times 10^3),表示 WW 的上界。

输出格式

输出第一行包含一个整数 nn (1n1041 \le n \le 10^4),表示构造的 01 背包的物品数量。

第二行输出 nn 个整数 w1,w2,,wnw_1,w_2,\ldots,w_n (1wiWlim1 \le w_i \le W_{lim}) 表示物品的重量。

第三行输出 nn 个整数 v1,v2,,vnv_1,v_2,\ldots,v_n (1vi1091 \le v_i \le 10^9) 表示物品的价值。

可以证明,在给定的问题以及输入条件下,总能找到满足上述数据范围的解。

2
2
1 2
2 3