hdu1664 放苹果(经典简单dfs)

这是一道关于将m个苹果分给n个盘的经典搜索问题。通过深度优先搜索(DFS)可以解决,需考虑各种边界条件。当苹果树只剩1个或盘子只剩1个时,搜索结束。若苹果数小于盘子数,剩余盘子无效,继续DFS;若苹果数大于等于盘子数,分满或不满两种情况,分别进行DFS。此题关键在于寻找正确的边界条件,对思维能力是很好的锻炼。
摘要由CSDN通过智能技术生成


http://poj.org/problem?id=1664

题意:经典的m个苹果分给n个盘,求问多少种分发。


思路:刚开始想用并查集做这题,后来才知到居然深搜就行。既然是深搜,就要全部情况都考虑好,边界也要处理好。

搜索终止条件,苹果树为1,那只有一种了;盘子为1,那全放进去,也是一种;当苹果数为0,题目中说允许有盘子空着不放,那这也算一种= =[金馆长脸]。

然后考虑边界,当m比n小,那剩余的盘子相当于无效,就继续dfs(m, m);

当m大于等于n的时候,就是我们平常的放法。而我们平常放时就有放满和不满的情况,不满的就dfs(m, n-1)继续往下搜,满的就dfs(m-n, n)往下搜。


ps:搜索这种题。。必须找到边界条件才能做,边界条件就很难找啊,以前上学时候哪有题是这样的,哎得多练。这题就是赤裸裸考你找边界,很好一道题,锻炼了思维。


#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <iostream>

using namespace std;

typedef long long LL;

const int N = 100010;
const int INF = 0x3f3f3f3f;

int dfs(int m, int n)
{
    if(m == 1 || n == 1 || m == 0) return 1;
    if(m < n)
        return dfs(m, m);
    else
        return dfs(m, n-1)+dfs(m-n, n);
}

int main()
{
   // freopen("in.txt", "r", stdin);
    int t, m, n, ans;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d%d", &m, &n);
        ans = dfs(m, n);
        printf("%d\n", ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值