回 帖 发 新 帖 刷新版面

主题:[讨论]堆栈排序 输出所有的顺序

★问题描述:
球赛门票的售票处规定每位购票者限购一张门票,且每张门票售价 50元。购票者中有
m位手持50元钱币,另有n人手持100元。假设售票处开始售票时无零钱。问这m+n人有
几种排队方式可使售票处不致出现找不出钱的局面。
★编程任务:
对给定的m,n(0<=m,n<=11),输出各种排队方式(从小到大),计算出排队方式总数。
★数据输入:
由文件input.txt给出输入数据。输入只有一行两个整数m和n。
★结果输出:
将计算出的结果输出到文件output.txt。对每一组测试数据输出所有的方案以及方案
总数。
输入文件示例 输出文件示例
input.txt output.txt
3 2 50 50 50 100 100
50 50 100 50 100
50 50 100 100 50
50 100 50 50 100
50 100 50 100 50


这个的一个题目。。。。我现在的想法就是有堆栈来实现,
在排第i个100的时候,前至少有i个50


但是想不懂的是,比如输出50  50 50  100 100 
这么样子处理,接着用栈,什么时候进栈,什么时候出栈,才能保证输出的各个都不想同,
要怎么去控制什么时候出栈,什么时候入栈
如果是穷举的话,ms很大。。。。


就是这个控进栈和出栈的算法不懂,求高手帮忙分析下!!
想用栈去做。。。想了很久还是没有想到怎么去控制!!!

回复列表 (共2个回复)

沙发

#include <stdio.h>

#define MAX_M    11
#define MAX_N    11

int m, n;
int total;
int stk[MAX_M+MAX_N];

void solve(int m_used, int n_used)
{
    int i;
     if (m_used == m && n_used == n)
    {
        for (i=0; i<m+n; i++)
            printf("%d ", stk[i]);
        printf("\n");
        total++;
        return;
    }
    if (m_used < m)
    {
        stk[m_used+n_used] = 50;
        solve(m_used+1, n_used);
    }
    if (n_used < n && m_used > n_used)
    {
        stk[m_used+n_used] = 100;
        solve(m_used, n_used+1);
    }
}

int main()
{
    while (scanf("%d%d", &m, &n) != EOF)
    {
          total = 0;
        solve(0, 0);
        printf("total = %d\n", total);
    }
    return 0;
}

板凳

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

我来回复

您尚未登录,请登录后再回复。点此登录或注册