采用深搜,得到了比动态规划时间复杂度和空间复杂度更好的效果。
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
bool findSolution(map<int,int>&coins,map<int,int>::iterator it,int V,vector<int>&path)
{
pair<int,int> count=*it;
int v=V;
int num=0;
while(v>=count.first&&num<count.second)
{
v-=count.first;
path.push_back(count.first);
if(v==0) return true;
num++;
}
if(num==0) return false;
while(num>0)
{
map<int,int>::iterator it2(it);
if(++it2==coins.end())
{
while(num--) path.pop_back();
return false;
}
if(findSolution(coins,it2,v,path)) return true;
v+=count.first;
path.pop_back();
num--;
}
map<int,int>::iterator it2(it);
if(++it2==coins.end()) return false;
if(findSolution(coins,it2,v,path)) return true;
return false;
}
int main()
{
int N,V;
cin>>N>>V;
vector<int> coins(N);
for(int i=0;i<N;++i)
scanf("%d",&coins[i]);
map<int,int> count;
for(int i=0;i<N;++i)
count[coins[i]]++;
vector<int>path;
if(findSolution(count,count.begin(),V,path))
{
cout<<path[0];
for(int i=1;i<path.size();++i)
{
cout<<' '<<path[i];
}
cout<<endl;
}
else
cout<<"No Solution"<<endl;
return 0;
}