背包问题
背包问题的算法研究及应用

背包问题的算法研究及应用背包问题是一种经典的组合优化问题,常常被用来研究在有限的空间下如何使价值最大化。
背包问题可以分为 01 背包问题、完全背包问题、多重背包问题和混合背包问题等多种类型。
这些问题的求解方法也各有特点,需要根据具体问题进行选择。
本文主要介绍 01 背包问题和完全背包问题的求解算法及应用。
一、01 背包问题01 背包问题指的是在一个容量为 V 的背包中装入物品,每件物品都有自己的体积 vi 和价值 wi,问怎样装能使背包价值最大化,且物品不能重复使用。
01 背包问题可以用贪心算法或动态规划算法进行求解。
贪心算法的思想是每次选择当前最优的物品,直到背包无法继续装下为止。
但是贪心算法不能保证一定能获得最优解。
动态规划算法则是将问题分解为子问题,并通过递推关系式来求解。
具体来说,我们定义一个 dp[i][j] 表示将前 i 件物品放入容量为 j 的背包中所能获得的最大价值,则有:dp[i][j] = max(dp[i-1][j], dp[i-1][j-vi]+wi)其中 max 表示取两者中的最大值,dp[i-1][j] 表示不选择第 i 件物品,dp[i-1][j-vi]+wi 表示选择第 i 件物品放入背包中。
根据递推关系式,我们可以得到目标值为dp[n][V],其中 n 表示物品个数。
二、完全背包问题完全背包问题指的是在一个容量为 V 的背包中装入物品,每件物品都有自己的体积 vi 和价值 wi,问怎样装能使背包价值最大化,且每件物品可以无限使用。
完全背包问题和 01 背包问题类似,也可以用贪心算法或动态规划算法进行求解。
贪心算法的思想是每次选择当前最优的物品,并一直选择直到不能再在背包中装入为止。
但是贪心算法仍然不能保证获得最优解。
动态规划算法则是将问题分解为子问题,并通过递推关系式来求解。
与 01 背包问题相比,完全背包问题的递推关系式与之略有不同,具体来说,我们定义一个 dp[i][j] 表示将前 i 件物品放入容量为 j 的背包中所能获得的最大价值,则有:dp[i][j] = max(dp[i-1][j-k*vi]+k*wi)其中 max 表示取两者中的最大值,k 表示第 i 件物品中的物品数量。
理学背包问题详解

0 1 2 3 4 5 6 7 8 9 10
000000000000
x1=1
w1=2 v1=6 1 0 0 6 6 6 6 6 6 6 6 6
x2=1
w2=2 v2=3 2 0 0 6 6 9 9 9 9 9 9 9
x3=0
w3=6 v3=5 3 0 0 6 6 9 9 9 9 11 11 14
可用动态规划算法求解。
3
其他类型背包问题
完全背包问题(0/1):
有N种物品和一个容量为V的背包,每种物品都有 无限件可用。第i种物品的费用是c[i],价值是w[i]。 求解将哪些物品装入背包可使这些物品的费用总和 不超过背包容量,且价值总和最大。
多重背包问题
有N种物品和一个容量为V的背包。第i种物品最多 有n[i]件可用,每件费用是c[i],价值是w[i]。求解 将哪些物品装入背包可使这些物品的费用总和不超 过背包容量,且价值总和最大。
{// 计算x
for (int i=1; i<n; i++)
if (m[i][c]==m[i+1][c])
x[i]=0;
else
{
x[i]=1;
c-=w[i];
}
x[n]=(m[n][c])?1:0;
}
11
算法改进
由m(i,j)的递归式容易证明,在一般情况下,对每一个确定的 i(1≤i≤n),函数m(i,j)是关于变量j的阶梯状单调不减函数。跳跃 点是这一类函数的描述特征。在一般情况下,函数m(i,j)由其 全部跳跃点唯一确定。如图所示。
(7,7)
(6,6) (4,5)
(4,5)(6,6)
(0,
0)
(2,
(3,2) 1)
背包问题课件

刷表法——手推
【样例输入】package.in
10 4
21
for(int i=1;i<=n;++i)
Hale Waihona Puke 33for(int v=m;v>=w[i];--v)
45
f[v]=max(f[v],f[v-w[i]]+c[i])
79
【样例输出】package.out
12
i
W[i]
C[i]
i=0
0
0
i=1
2
1
i=2
理一件物品,作为一个阶段,共有n个 阶段 2、定义状态:
定义f[i][v]是前i件物品恰好放 入一个容量为v的背包,所得到的最大 价值 3、状态转移方程: 若第i件物品没有放入背包,则f[i][v]=f[i-
1][v] 若第i件物品放入背包,则f[i][v]=f[i-1][v-
w[i]]+c[i] 根据状态定义,f[i][v]=max(f[i-1][v],f[i-
【输出格式】 仅一行,一个数,表示最大总价值。
【样例输入】package.in 10 4 21 33 45 79
【样例输出】package.out 12
01背包
【问题描述】 一个旅行者有一个最多能用m公斤的
背包,现在有n件物品,它们的重量分别是 W1,W2,...,Wn,它们的价值分别为 C1,C2,...,Cn.若每种物品只有一件求旅行者 能获得最大总价值。 【输入格式】
1][v-w[i]]+c[i]) 4、临界值: 当i==0时,表示一件物品也没有, f[0][v]=0,数组f在main函数前定义即可
刷表法——手推
【样例输入】package.in 10 4
背包问题全类型

背包问题全类型背包问题给定⼀组物品,每种物品都有⾃⼰的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最⾼。
背包问题⼤体都可以⽤上述⽅式进⾏描述,但在具体的问题上有了不同的限制条件,于是便有了各种类型的背包问题。
背包问题可基本分为0-1背包问题、部分背包问题、多重背包问题、完全背包问题四⼤类。
接下从四种问题的解决的核⼼算法可以把部分背包问题单独化为⼀类,其核⼼算法为贪⼼。
其余的三种背包问题都可以⽤动态规划解决。
造成部分背包问题与其他的背包问题最⼤不同的原因是其限定条件的不同,部分1. 部分背包问题限定条件:每件物品可以只选取⼀部分完整问题描述:有 n 件物品,第i件物品重 w[i],价值为 v[i],且每件物品可以进⾏分割,分割后的价值按取⾛重量占该物品总重量的⽐值计算。
在不超过最⼤承载量 C 的范围内,问最⼤可以取⾛的价值为多少?( 其中 i ∈ {1,2,3,···,n} )算法:贪⼼分析:根据本题的特殊性,我们可以任意地对某⼀部品进⾏分割,所以我们优先选择性价⽐⾼的物品,即单位重量下物品的价值。
解题代码//C++#include<cstdio>#include<algorithm>#include<iostream>using namespace std;struct bag { int w,v; //w表⽰重量 v表⽰价值 double p; //⽤来储存v/w 性价⽐}a[10005];bool cmp(bag x,bag y) { return x.p > y.p; //性价⽐⾼的物品排在前⾯}int main() {剩余 } } printf('%.2f\n', ans); //输出答案 return 0;}注意计算时注意数据类型在计算“性价⽐”的时候要注意,在C/C++等⼀部分语⾔中存在以下机制 int/int = int ,这样是⽆法计算出⼩数的,需要将其中任意⼀项浮点化即可。
第04讲 背包问题及分枝界定法

分组背包问题
有N件物品和一个容量为V的背包.第i件物品的 费用是c[i],价值是w[i].这些物品被划分为若 干组,每组中的物品互相冲突,最多选一件.求 解将哪些物品装入背包可使这些物品的费用总和 不超过背包容量,且价值总和最大.
有依赖的背包问题
这种背包问题的物品间存在某种"依赖"的关 系.也就是说,i依赖于j,表示若选物品i, 则必须选物品j.为了简化起见,我们先设 没有某个物品既依赖于别的物品,又被别的 物品所依赖;另外,没有某件物品同时依赖 多件物品.
这样我们就得到一个更好的上界.U1 是由Dantiz给出, U2 是由Martello和grange给出的.
广探法
用根结总表示原背包问题,求出它的上界; 在根节点通过取 x1 = 1, x1 = 0 , 进行分枝,得到两个子 问题,分别计算这两个子节点对应背包问题的上界. 选取具有最大上界的节点进行分枝.对选取的节点, 设物品j为尚未确定是否放入包内的物品,且它在这类 物品中具有最大价值密度,则通过取 x j = 1,x j = 0 ,进 行分枝产生两个子节点. 在分枝过程中,若某个子节点的上界小于当前原问题 的某一个可行解值,则该子节点删去不再进行分枝.
深探法
如果在某节点处的分枝 x j = 1 对应的子问题不可行, 则删去分枝,回到分枝 x j = 0 对应的子问题继续进行. 若某一个分支进行到最后一个物品,则可产生一个可 行解,将它与已有的其它的可行解进行比较,保留最 好的一个,然后回到最迟发生的某个 x j = 0 分枝继续 进行. 在上述过程中若某子节点上界小于当前已有的可行解 值,则该子节点删去.
s 1
定理
设 U =
0
∑
s 1 i =1
完全背包问题的解决方案

完全背包问题的解决方案背包问题是计算机科学中的一个重要问题,其基本思想是给定一组物品和一个背包,每个物品都有自己的重量和价值,目标是找到一种最佳的方式将物品放入背包中,使得背包中物品的总价值最大。
背包问题分为0-1背包问题、多重背包问题和完全背包问题,本文将着重介绍完全背包问题的解决方案。
完全背包问题定义如下:给定一组物品,每个物品的重量为w[i],价值为v[i],背包的容量为C,每个物品可选择任意次数放入背包。
求解背包能够容纳的物品的最大总价值。
为了解决完全背包问题,我们可以使用动态规划算法。
我们定义一个二维数组dp,其中dp[i][j]表示前i个物品在背包容量为j时的最大总价值。
根据动态规划的思想,我们可以得到递推公式:dp[i][j] = max(dp[i-1][j-k*w[i]] + k*v[i]),其中0 ≤ k ≤ j/w[i]根据上述递推公式,我们可以按照以下步骤解决完全背包问题:Step 1: 初始化dp数组。
dp数组的大小为(n+1)×(C+1),其中n表示物品的数量,C表示背包的容量。
将dp数组的所有元素初始化为0。
Step 2: 遍历背包容量。
外层循环从1到C,表示背包的容量。
Step 3: 遍历物品。
内层循环从1到n,表示物品的数量。
Step 4: 更新dp数组。
根据递推公式,计算dp[i][j]的值,并更新dp数组中的元素。
Step 5: 输出结果。
输出dp[n][C],即背包能够容纳的物品的最大总价值。
下面是一个具体的示例来说明完全背包问题的解决方案:假设背包容量为10,共有3个物品:物品1的重量和价值分别为2和3;物品2的重量和价值分别为4和5;物品3的重量和价值分别为6和8。
根据上述解决方案的步骤,我们可以得到如下的动态规划求解过程:Step 1: 初始化dp数组。
dp[0][0] = 0dp[0][1] = 0...dp[0][10] = 0Step 2: 遍历背包容量。
背包问题

完全背包问题也是一个相当基础的背包问题,它有两个状态转移方程,分别在“基本思路”以及“O(VN) 的算法“的小节中给出。希望你能够对这两个状态转移方程都仔细地体会,不仅记住,也要弄明白它们是怎么得 出来的,最好能够自己想一种得到这些方程的方法。事实上,对每一道动态规划题目都思考其方程的意义以及如 何得来,是加深对动态规划的理解、提高动态规划功力的好方法。
这个问题非常类似于01背包问题,所不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关 的策略已并非取或不取两种,而是有取0件、取1件、取2件……等很多种。如果仍然按照解01背包时的思路,令 f[i,v]表示前i种物品恰放入一个容量为v的背包的最大权值。仍然可以按照每种物品不同的策略写出状态转移方程, 像这样:f[i,v]=max{f[i,v-vi]+wi,f[i-1,v]}。这跟01背包问题一样有O(N*V)个状态需要求解,但求解每个状态的 时间则不是常数了,求解状态f[v]的时间是O(v/c),总的复杂度是超过O(VN)的。
背包问题已经研究了一个多世纪,早期的作品可追溯到1897年 数学家托比亚斯·丹齐格(Tobias Dantzig, 1884-1956)的早期作品 ,并指的是包装你最有价值或有用的物品而不会超载你的行李的常见问题。
应用
1998年的石溪布鲁克大学算法库的研究表明,在75个算法问题中,背包问题是第18个最受欢迎,第4个最需 要解决的问题(前三为后kd树,后缀树和bin包装问题)。
基础背包
题目 基本思路
空间复杂 示例程序
递归实现 程序
测试数据 总结
有N件物品和一个容量为V的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些 物品的重量总和不超过背包容量,且价值总和最大。
数学建模背包问题

背包问题背包问题(Knapsack problem)是一种组合优化的NP 完全问题。
问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
问题的名称来源于如何选择最合适的物品放置于给定背包中。
相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。
也可以将背包问题描述为决定性问题,即在总重量不超过W 的前提下,总价值是否能达到V ?它是在1978年由Merkel 和Hellman 提出的一、定义:背包问题属于组合优化问题,一般的最优化问题由目标函数和约束条件两部部分组成:我们有n 种物品,物品i 的重量为w i ,价格为p i 。
我们假定所有物品的重量和价格都是非负的。
背包所能承受的最大重量为W 。
如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。
可以用公式表示为:1max ni i i p x =∑1..,ni i i S T w x W =≤∑ {}0,1i x ∈如果限定物品i 最多只能选择b i 个,则问题称为有界背包问题。
可以用公式表示为:1max ni i i p x =∑1..,n i i i S T w xW =≤∑ {}0,1,,i i x b ∈⋅⋅⋅如果不限定每种物品的数量,则问题称为无界背包问题。
各类复杂的背包问题总可以变换为简单的0-1背包问题进行求解。
二、基本模型的建立方法1、0-1背包问题的数学模型(最基础的背包问题)分类:0-1背包问题简单分为一维背包和二维背包问题。
特点:每种物品仅有一件,可以选择放或不放。
1.1 一维背包问题问题:一个旅行者准备进行徒步旅行,为此他必须决定携带若干物品。
设有n 件物品可供他选择,编号为1,2,...,n 第i 件物品重量为i w 千克,价值为i p 元,他能携带的最大重量为w 千克。
他应该装入哪几件物品价值最大。
解:引入变量i x ,且设1,(1,2,,)0,i i x i n i ⎧==⎨⎩表示将第种物品装入包中表示不将第种物品装入包于是此问题的数学模型为:1max ni i i f p x ==∑1122.....01,1,2,...,.n n iw x w x w x W S T x i n +++≤⎧⎨==⎩或 1.2 二维背包问题一维背包问题只考虑了背包重量的限制,如果再增加背包体积的限制为V ,并设第i 件物品的体积i v ,问如何携带可使总价值最大。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贪心法求解的问题的特征:
(1)最优子结构性质
当一个问题的最优解包含其子问题的最优解时, 称此问题具有最优子结构性质,也称此问题满足最 优性原理。
(2)贪心选择性质
所谓贪心选择性质是指问题的整体最优解可以 通过一系列局部最优的选择,即贪心选择来得到。
动态规划法通常以自底向上的方式求解各个子问 题,而贪心法则通常以自顶向下的方式做出一系列 的贪心选择。
(3)合并:把各个子问题的解合并起来,合并的代价因 情况不同有很大差异,分治算法的有效性很大程度上依赖 于合并的实现。
例:计算an,应用分治技术得到如下计算方法:
an
a
=
a
n
2
´ a n 2
如果 n = 1 如果 n > 1
34
32
32
31
31
31
31
3
3
3
3
9
9
81
分解问题 求解每个子问题 合并子问题的解
(5)可行函数feasible:检查解集合中加入一个候 选对象是否可行,即解集合扩展后是否满足约束条 件。例如,在付款问题中,可行函数是每一步选择 的货币和已付出的货币相加不超过应付款。
贪心法的一般过程
Greedy(C) //C是问题的输入集合即候选集合 {
S={ }; //初始解集合为空集 while (not solution(S)) //集合S没有构成问题的一个解 {
由于原问题的解与较小规模的子问题的解之 间存在这种关系,所以,只需求解其中一个较小 规模的子问题就可以得到原问题的解。
减治法的设计思想
原问题 的规模是n
子问题 的规模是n/2
子问题的解 原问题的解
例:计算an的值,应用减治技术得到如下计算方法:
a
an
=
(an 2 )2
(a( n-1) 2 )2 a´
例:用贪心法求解付款问题。 假设有面值为5元、2元、1元、5角、2角、1角的货币,需 要找给顾客4元6角现金,为使付出的货币的数量最少,首 先选出1张面值不超过4元6角的最大面值的货币,即2元, 再选出1张面值不超过2元6角的最大面值的货币,即2元, 再选出1张面值不超过6角的最大面值的货币,即5角,再选 出1张面值不超过1角的最大面值的货币,即1角,总共付出 4张货币。
例:付款问题: 超市的自动柜员机(POS机)要找给顾客数量最少的现金。
假 定 POS 机 中 有 n 张 面 值 为 pi(1≤i≤n) 的 货 币 , 用 集 合 P={p1, p2, …, pn}表示,如果POS机需支付的现金为A,那么, 它必须从P中选取一个最小子集S,使得
m
pi S , pi = A (m =| S |) i =1
减治法
普卢塔克说,萨特斯为了告诉他的士兵坚韧和 智慧比蛮力更重要的道理,把两匹马带到他们面前, 然后让两个人扒光马的尾毛.一个人是魁梧的大力 士,他抓住尾巴扒了又扒,但一点效果也没有;另 一个人是一个精明的、长相狡黠的裁缝,他微笑着, 每次扒掉一根毛,很快就把尾巴拔得光秃秃的。
减治法的设计思想
规模为n的原问题的解与较小规模(通常是 n/2)的子问题的解之间具有关系: (1)原问题的解只存在于其中一个较小规模的 子问题中; (2)原问题的解与其中一个较小规模的解之间 存在某种对应关系。
(n
0 / 2)
1
n =1 n >1
所以,通常来说,应用减治法处理问题的效率 是很高的,一般是O(log2n)数量级。
动态规划法
思想,就像幽灵一样…… 在它自己解释自己之前,必须 先告诉它些什么。
--狄更斯
概述
1 最优化问题 2 最优性原理 3 动态规划法的设计思想
1 最优化问题
最优化问题:有n个输入,它的解由这n个输入 的一个子集组成,这个子集必须满足某些事先给定 的条件,这些条件称为约束条件,满足约束条件的 解称为问题的可行解。满足约束条件的可行解可能 不只一个,为了衡量这些可行解的优劣,事先给出 一定的标准,这些标准通常以函数的形式给出,这 些标准函数称为目标函数,使目标函数取得极值 (极大或极小)的可行解称为最优解,这类问题就 称为最优化问题。
w1=7 v1=42
物品1
w2=3 v2=12
物品2
w3=4 v3=40
物品3
w4=5 v4=25
物品4
总重量
0 7 3 4 5 10 11 12
总价值
0 42 12 40 25 54 不可行 不可行
序号
9 10 11 12 13 14 15 16
子集 总重量 总价值
{2,3} 7 {2,4} 8 {3,4} 9 {1,2,3} 14 {1,2,4} 15 {1,3,4} 16 {2,3,4} 12 {1,2,3,4} 19
贪心法的求解过程
用贪心法求解问题应该考虑如下几个方面:
(1)候选集合C:为了构造问题的解决方案,有一 个候选集合C作为问题的可能解,即问题的最终解 均取自于候选集合C。例如,在付款问题中,各种 面值的货币构成候选集合。
(2)解集合S:随着贪心选择的进行,解集合S不 断扩展,直到构成一个满足问题的完整解。例如, 在付款问题中,已付出的货币构成解集合。
(3)解决函数solution:检查解集合S是否构成问 题的完整解。例如,在付款问题中,解决函数是已 付出的货币金额恰好等于应付款。
(4)选择函数select:即贪心策略,这是贪心法 的关键,它指出哪个候选对象最有希望构成问题的 解,选择函数通常和目标函数有关。例如,在付款 问题中,贪心策略就是在候选集合中选择面值最大 的货币。
0/1 背包问题
0/1背包问题
0/1背包问题是给定n个重量为{w1, w2, … ,wn}、 价值为{v1, v2, … ,vn}的物品和一个容量为C的背包, 求这些物品中的一个最有价值的子集,并且要能够 装到背包中。
10 背包
w1=7 v1=42
物品1
w2=3 v2=12
物品2
w3=4 v3=40
在付款问题每一步的贪心选择中,在不超过应付款 金额的条件下,只选择面值最大的货币,而不去考虑在 后面看来这种选择是否合理,而且它还不会改变决定: 一旦选出了一张货币,就永远选定。付款问题的贪心选 择策略是尽可能使付出的货币最快地满足支付要求,其 目的是使付出的货币张数最慢地增加,这正体现了贪心 法的设计思想。
用蛮力法求解
用蛮力法解决0/1背包问题,需要考虑给定n个 物品集合的所有子集,找出所有可能的子集(总重 量不超过背包容量的子集),计算每个子集的总价 值,然后在他们中找到价值最大的子集。
10
背包
序号
1 2 3 4 5 6 7 8
子集
φ {1} {2} {3} {4} {1,2} {1,3} {1,4}
启发式规则:
1. 平衡子问题:最好使子问题的规模大致相同。也就是将一 个问题划分成大小相等的k个子问题(通常k=2),这种使子 问题规模大致相等的做法是出自一种平衡(Balancing)子问 题的思想,它几乎总是比子问题规模不等的做法要好。
2. 独立子问题:各子问题之间相互独立,这涉及到分治法的 效率,如果各子问题不是独立的,则分治法需要重复地解公 共的子问题。
an=a×a×…×a n次
蛮力法所赖的基本技术——扫描技 术
关键——依次处理所有元素 基本的扫描技术——遍历
(1)集合的遍历 (2)线性表的遍历 (3)树的遍历 (4)图的遍历
虽然巧妙和高效的算法很少来自于蛮力法,基于 以下原因,蛮力法也是一种重要的算法设计技术:
(1)理论上,蛮力法可以解决可计算领域的各种问题。 (2)蛮力法经常用来解决一些较小规模的问题。 (3)对于一些重要的问题蛮力法可以产生一些合理的算 法,他们具备一些实用价值,而且不受问题规模的限制。 (4)蛮力法可以作为某类问题时间性能的底限,来衡量 同样问题的更高效算法。
n =1 n >1且是偶数 n >1且是奇数
O (log2n)
应用分治法得到an的计算方法是:
an
=
a
n
a 2 an
2
n =1 n >1
O (nlog2n)
减治法只对一个子问题求解,并且不需要进行 解的合并。应用减治法(例如减半法)得到的算法 通常具有如下递推式:
T
(n)
=
T
(式6.1)
如果用向量X=( x1, x2, …, xn)表示S中所选取的货币,则
1 xi = 0
pi S pi S
概述
贪心法的设计思想 贪心法的求解过程
贪心法的设计思想
贪心法在解决问题的策略上目光短浅,只根据当 前已有的信息就做出选择,而且一旦做出了选择, 不管将来有什么结果,这个选择都不会改变。换言 之,贪心法并不是从整体最优考虑,它所做出的选 择只是在某种意义上的局部最优。
这种局部最优选择并不总能获得整体最优解 (Optimal Solution),但通常能获得近似最优解 (Near-Optimal Solution)。
x=select(C); //在候选集合C中做贪心选择 if feasible(S, x) //判断集合S中加入x后的解是否可行
S=S+{x}; C=C-{x}; } return S; }
用贪心法解
至少有三种看似合理的贪心策略: (1)选择价值最大的物品,因为这可以尽可能快
地增加背包的总价值。但是,虽然每一步选择获得 了背包价值的极大增长,但背包容量却可能消耗得 太快,使得装入背包的物品个数减少,从而不能保 证目标函数达到最大。
物品3
w4=5 v4=25
物品4
蛮力法
就像宝剑不是撬棍一样,科学也很少使用蛮力。 ---Edward Lytton