这个题,柳神用的是0/1背包,咱也不知道咋用,咱也看不懂,咱也不敢问。个人试着拿回溯做,超时了,最后一个测试点不过,想想还是把代码留着吧,也希望各位看官帮忙看看怎么提高下效率;
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N,M,sum;
int F[10010];
vector<int> res;
void Get(int i)
{
int j;
for(j=i;j<N;j++)
{
if(sum+F[j]<M)
{
sum+=F[j];
res.push_back(F[j]);
Get(j+1);
sum-=F[j];
res.pop_back();
Get(j+1);
}
else if(sum+F[j]==M)
{
sum+=F[j];
res.push_back(F[j]);
cout<<res[0];
for(int ii=1;ii<res.size();ii++)cout<<" "<<res[ii];
exit(0);
//找到了
} else return ;
}
}
int main()
{
int i,j;
scanf("%d %d",&N,&M);
for(i=0;i<N;i++)
{
scanf("%d",&F[i]);
}
sum=0;
sort(F,F+N);
Get(0);
cout<<"No Solution";
return 0;
}