题目:
3 5<br>1 3 2<br>3 6<br>1 3 2<br>4 100<br>1 2 3 2<br>
1<br>3<br>2<br>1 3<br>1 2<br><br>1<br>3<br>2<br>1 3<br>1 2<br><br>1<br>2<br>3<br>1 2<br>1 3<br>2 3<br>2 2<br>1 2 3<br>1 2 2<br><br><br><div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div>Hint : You must make sure each subsequence in the subsequences is unique.</div>
题意:给你N个数,基本上有点求它的子集的感觉,因为他不能重复。。
想法:深搜加剪枝即可。。
代码:
#include<iostream>
#include<cstring>
using namespace std;
int d[1009];
int n,p;
int l,c;
struct name
{
int now,pos;
};
name w[10009];
bool flag;
bool check(int s,int e)
{
for(int i=s+1;i<e;i++)
{
if(d[i]==d[e])
return false;
}
return true;
}
void set(int length)
{
for(int i=0;i<length-1;i++)
cout<<w[i].now<<" ";
cout<<w[length-1].now<<endl;
}
void dfs(int dep,int pos)
{
if(c>=p)
return;
if(dep==l)
{
c++;
flag=true;
set(l);
return;
}
for(int i=pos;i<n;i++)
{
if((dep!=0&&w[dep-1].now<=d[i])||dep==0)
{
if(dep==0&&!check(-1,i))
continue;
if(dep!=0&&!check(w[dep-1].pos,i))
continue;
w[dep].now=d[i];
w[dep].pos=i;
dfs(dep+1,i+1);
}
}
return;
}
int main()
{
int i;
while(cin>>n>>p)
{
for(i=0;i<n;i++)
cin>>d[i];
c=0;
for(i=1;i<n;i++)
{
flag=false;
l=i;
dfs(0,0);
if(c>=p||!flag)
break;
}
cout<<endl;
}
return 0;
}
感想:好难。。