【C++】递归、递推和记忆化搜索例题:拍卖

例题:拍卖

题目描述
一般情况下,拍卖行的拍卖师在拍卖商品的时候都是从低价开始起拍,由买方报价,最后谁出的价格高,商品就归谁所有。但海亮高中信奥公司有个拍卖行,拍卖师小刘在拍卖商品时正好相反:总是从高价开始起拍,如果没有人举成交牌就降价,而且拍卖师在降价时还有规律:假如第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(
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值