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; }