例题:拍卖
【题目描述】
一般情况下,拍卖行的拍卖师在拍卖商品的时候都是从低价开始起拍,由买方报价,最后谁出的价格高,商品就归谁所有。但海亮高中信奥公司有个拍卖行,拍卖师小刘在拍卖商品时正好相反:总是从高价开始起拍,如果没有人举成交牌就降价,而且拍卖师在降价时还有规律:假如第i次报价为w元,那么第i+1次报价为w-a或者w-b元,如果降到p元时,你认为价格合适,赶快第一个举成交牌,你就花p元买下了商品。
任务:拍卖师把商品从w元降到p元的方法总数。
【输入格式】
第一行有两个正整w 和p ,第二行有有两个正整a 和b。 1 ≤ w,p ≤ 10^6, 2 ≤ a,b ≤ 10000, a不等于b.
【输出格式】
只有一行,即所求得的方法总数。注意:测试数据中方法总数不超过MAXlongint.
【样例输入】
16 10
2 4
【样例输出】
3
【分析】
样例解释:
三种方法:16–14–12–10;16–14–10;16–12–10;
先来分析递归怎么写:
1)参数:我们只需要在意操作数当前的值就可以了,一个参数k表示当前数的值;
2)边界:如果可以等于y,那么方法数加1;如果当前的值已经小于等于y,那么再往下递归就没有意义了;
3)范围:当前的数在选择时,可以选择减a,也可以选择减b,范围就是两个数。
【代码1】
#include<bits/stdc++.h>
using namespace std;
int w,p,a,b,ans;//ans是所求方案总数
void dfs(int k)
{
if(k==p)ans++;//结果边界,到达y,结果+1
if(k<=p)return;//递归边界,往下再搜索就没有意义了
dfs(k-a);dfs(k-b);//因为每个数只能减两个,所以递归分了两叉
}
int main(