#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, p, a[1005];
int cnt = 0, len;
bool flag;
struct node {
int num, pos;//num为值, pos为在a数组中的下标
} res[1005];
bool judge(int beg, int end) {
for(int i = beg; i < end; i++)
if(a[i] == a[end])
return false;
return true;
}
//实质上是组合问题
void dfs(int l, int pos) { //l已经生成的长度,pos是从这一位开始考虑
if(cnt >= p)
return ; //已经达到了最大要求的个数,不需要继续生成
if(l == len) { //达到了要求的个数
cnt++; //生成的个数+1
flag = true; //在当前长度下找到了一个解
for(int i = 0; i < l-1; i++)
printf("%d ", res[i].num);
printf("%d\n", res[l-1].num); //输出对应的结果
return;
}
for(int i = pos; i < n; i++) { //从当前位开始向下生成
if((l != 0 && res[l-1].num <= a[i]) || l == 0) { //该条件表示序列需要递增,基本要求
if(l != 0 && !judge(res[l-1].pos+1, i))
continue;
if(l == 0 && !judge(0, i))
continue;
res[l].num = a[i];
res[l].pos = i;
dfs(l+1,i+1);
}
}
}
int main() {
freopen("data.in", "r", stdin);
while(scanf("%d %d", &n, &p) != EOF) {
for(int i = 0; i < n; i++)
scanf("%d", a+i);
cnt = 0;
for(int i = 1; i <= n; i++) {
flag = false;
len = i; //子串的长度,从1开始
dfs(0,0);
if(cnt >= p || !flag)//重要剪枝,3个长的递增子序列都生成不了,就不要想4个长的了
break;
}
printf("\n");
}
return 0;
}
HDU 2610 Sequence one(DFS)
最新推荐文章于 2020-04-26 23:16:40 发布