一看到“M(<=102, the amount of money Eva has to pay)”就两眼冒绿光了有没有啊,空间时间复杂度都大大缩小了。本来有点想背包,一看输出还要求output the smallest sequence,就干脆深搜了。深搜层数不会超过100层,时间复杂度……时间复杂度我算不出来,哪个大大能告诉我的话感激不尽。这样一想都点挂汗啊,说不定测试数据凶一点我就过不掉了。
#include<cstdio>
#include<iostream>
using namespace std;
int coin[105]={0};
int target;
struct road{
int r[105],step,sum;
road(){step=sum=0;}
void oupu(){
for(int i=0;i<step;i++)
if(i<step-1)
printf("%d ",r[i]);
else
printf("%d\n",r[i]);
}
void add(int x){
r[step++]=x;
sum+=x;
}
void dele(){
if(step<=0)return;
step--;
sum-=r[step];
}
};
bool func(struct road ro){
if(ro.sum>target)
return false;
if(ro.sum==target){
ro.oupu();
return true;
}
int i;
for(i=0;i<=target;i++){
if(coin[i]>0){
coin[i]--;
ro.add(i);
if(func(ro))return true;
ro.dele();
coin[i]++;
}
}
return false;
}
int main(){
int n,v;
scanf("%d%d",&n,&target);
while(n--){
scanf("%d",&v);
if(v<=target)
coin[v]++;
}
road ro;
if(!func(ro))
printf("No Solution\n");
return 0;
}