SOJ 1093

SOJ 1093: 伊拉克 http://acm.scu.edu.cn/soj/problem.action?id=1093

题意:有m艘船,给出每艘船的长度。现在把这m艘船排成n行,每一行至少有一艘船。给出这n行每一行的长度,输出该行船的个数以及每艘船的长度。多种情况下,将长的的放在前面。

这道题跟SOJ 1030有些类似,需要注意:

(1) 由于长的放前面,所以对m艘船的长度按降序排序;

(2) 深搜只输出第一个满足条件的结果,所以设置一个全局变量,加入break;

(3) 之前输出的元素加上标记。

#include<iostream>
#include<algorithm>
using namespace std;
int *len;
int *flag;
int *record1;
int *record2;
int mark;
void sum(int str, int m,int ithLen,int cal)
{
    int i;
    if (ithLen == 0)
    {
        mark = 1;
        printf("%d ", cal);
        for (i = 0; i < cal; i++)
        {
            printf("%d ", record1[i]);
            flag[record2[i]] = 0;
        }
        printf("\n");
    }
    else
    {
        for (i = str; i < m; i++)
        {
            if (mark)
                break;
            if (flag[i] && ithLen >= len[i])
            {
                record1[cal] = len[i];
                record2[cal] = i;
                sum(i+1,m,ithLen-len[i],cal+1);
            }
        }
    }
}
bool cmp(int a, int b)
{
    return a > b;
}
int main()
{
    int m, n;
    int ithLen;
    int i;
    while (scanf("%d%d", &m, &n) == 2 && m && n)
    {
        len = new int[m + 1];
        flag = new int[m+1];
        record1 = new int[m + 1];
        record2 = new int[m + 1];
        for (i = 0; i < m; i++)
        {
            scanf("%d", &len[i]);
            flag[i] = 1;
        }
        sort(len,len+m,cmp);
        for (i = 0; i < n; i++)
        {
            mark = 0;
            scanf("%d",&ithLen);
            sum(0,m,ithLen,0);
        }
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/ClearMoonlight/p/10455790.html