题目描述
01 背包问题是一个算法竞赛中经典的组合优化的问题,小 w 学会了一种求解该问题的贪心算法。01 背包问题的定义以及小 w 的贪心算法如下。
01 背包问题:
给定 n 个物品,物品的重量分别为正整数 w1,w2,…,wn ,物品的价值分别为正整数 v1,v2,…,vn,再给定背包容量 W。要求 x1,x2,…,xn (∀1≤i≤n, xi∈{0,1}),满足:
i=1∑nwixi≤W
并最大化:
V=i=1∑nvixi
贪心算法:
- 将 n 个物品按照 wivi 的值从大到小排序,wivi 相同则按照 wi 从大到小排序。
- 设一初始置 0 的变量 W0,并,并从 1 到 n 枚举 i,如果 V0+wi≤W,则置 xi←1,W0←W0+wi,否则置 xi←0。
- 枚举完之后即可得到所求的 x1,x2,…,xn 以及 V。
你当然知道这个算法是错误的,但小 w 并不相信。即使你给了小 w 一些反例,小 w 依然认为这个算法能在很多不同的 W 下都能得到最优的 V,所以你现在希望构造一组 w1,w2,…,wn 以及 v1,v2,…,vn 使得:
- ∀2≤W≤Wlim(Wlim 是一个给定的常数),小 w 的算法都无法得到最优的 V。
- 在满足条件 1 的情况下,n 尽量小。
- 在满足条件 1,2 的情况下,max(w1,w2,…,wn) 尽量小。
- 在满足条件 1,2,3 的情况下,max(v1,v2,…,vn) 尽量小。
现在你需要构造一组满足上述条件的 01 背包来说服小 w,你能做到吗?如果构造方法有多种,你可以输出任意一种。
输入格式
输入共一行包含一个整数 Wlim (2≤Wlim≤5×103),表示 W 的上界。
输出格式
输出第一行包含一个整数 n (1≤n≤104),表示构造的 01 背包的物品数量。
第二行输出 n 个整数 w1,w2,…,wn (1≤wi≤Wlim) 表示物品的重量。
第三行输出 n 个整数 v1,v2,…,vn (1≤vi≤109) 表示物品的价值。
可以证明,在给定的问题以及输入条件下,总能找到满足上述数据范围的解。
2
2
1 2
2 3