搜索之排队买票问题

题目描述:
有2n个人排队购一件为0.5元商品,其中一半人拿一张1元人民币,另一半人拿一张0.5元人民币,要使售货员在售货中,不发生找钱困难,问这2n个人如何排队?找出所有排队的方案。(售货员一开始就没有准备零钱!!!
输入
n
输出
排队方案,一行一个
样例输入:

2

样例输出:

0.5, 0.5, 1, 1
0.5, 1, 0.5, 1//注意,逗号后面有一个空格。

解析:
此题是一道明显的搜索题目,并且该题需使用回溯法。但要注意营业员没有准备零钱,所以在第i个人时,拿0.5元的人必须不得少于拿1元的人。
废话少说,上代码:

/*
    因为不知道n的大小,所以本人自作主张地用了map,呵呵。
*/
#include<cstdio>
#include<map>
using namespace std;
map<int,double>a;//必须用double类型
int n,tot;
void sc()//输出
{
    tot++;
    for(int i=1;i<=2*n;i++)
    {
        if(i>1)//处理逗号与空格
        {
            printf(", ");
        }
        printf("%g",a[i]);//按实际小数位数输出
    }
    printf("\n");
}
void pdmp(int t,int sum1,int sum2)//搜索主程序
{
    if(t>2*n)//如果填满了,输出并结束递归
    {
        sc();
        return;
    }
    if(sum1==n)//如果0.5元用完了,自动将剩下的位置赋值为1,并立即输出,结束递归
    {
        for(int i=t;i<=2*n;i++)
        {
            a[i]=1;
        }
        sc();
        return;
    }
    a[t]=0.5;//假设下一个人是拿着0.5元的
    pdmp(t+1,sum1+1,sum2);//搜索
    if(sum1>sum2)//如果拿0.5元的人比拿1元的人多
    {
        a[t]=1;//假设下一个人拿1元
        pdmp(t+1,sum1,sum2+1);//搜索
        a[t]=0;//回溯
    }
}
int main()//主函数
{
    scanf("%d",&n);//输入n
    pdmp(1,0,0);//调用搜索函数
    return 0;
}

小结:
这道题是一道搜索入门题目,题不难,但里面却有着满满的套路,(不告诉你n的范围,输出中逗号后面的空格)希望大家仔细观察。

猜你喜欢

转载自blog.csdn.net/qq_42990749/article/details/81775841
今日推荐