题目描述:
有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的范围,输出中逗号后面的空格)希望大家仔细观察。