贪心都是按照一定规则处理问题的。至于这个规则的证明一般有两种办法:归纳法和反证法。。我会第二种的一部分,找反例。一般来说都没人去肝贪心问题的证明。太长了也太难了。。大概正确的话基本都是正确的。凭直觉??(不能贪那肯定是DP了)(贪了很久还是WA,那么十有八九是DP)

1.硬币问题

给定若干种面额的硬币,每种数量不同。求怎么用来支付n元使得硬币数最少。(1,5,10,50,100)

这个显然可以贪心,因为大硬币可以用小硬币表示(不互质)(类似进制分解,二进制2能表示64 16 32 128..)

for(int i = n; i; --i) { //Ó²±ÒÖÖÀà
int t = min(A / v[i], c[i]);
A -= t * v[i];
ans += t;
}


若是硬币的面额是任意的,那么这就是个背包了。是个DP。详见看我的题解POJ1742.

2.区间问题

给定n个区间,求选取两两不相交区间.

我们不妨给定几个贪心方法

1.在可选的区间,每次都选开始左端点的。

2.在可选的区间,每次都选右端点最小的。

3.在可选的区间,每次都选长度最短的。

4.在可选区间,每次都选取与最少与可选区间重叠最小的区间。

1的反例

1111111111111111111111111
222222 3333333


3的反例

11111111111 22222222222
3333333


4反例

  111     111
111 111
111 111 111
111 111 111 111


所以按照右端点排序是对的咯。

sort(p + 1, p + 1 + n);
int now = 0, ans(0);

rep(i, 1, n) {
if(p[i].l >= now) {
now = p[i].r;
ans++;
}
}


3.字典序最小