题目链接

一道简单的dfs题,需要剪枝,否则会超时
#include <bits/stdc++.h>
using namespace std;
int n,m,que[10010],flag;
struct node
{
int v;
int book;
} a[10010];
bool cmp(node a,node b)
{
return a.v<b.v;
}
void dfs(int sum,int k)
{
if(sum>m)//剪枝,如果超过期望值,直接return回去
return;
if(sum==m)
{
for(int i=0; i<k-1; i++)
printf("%d ",que[i]);
printf("%d\n",que[k-1]);
flag=1;
exit(0);
}
for(int i=0; i<n; i++)
if(a[i].book==0)
{
a[i].book=1;
que[k]=a[i].v;
dfs(sum+a[i].v,k+1);
a[i].book=0;
}
return;
}
int main()
{
int sum=0;
cin>>n>>m;
for(int i=0; i<n; i++)
{
cin>>a[i].v;
sum+=a[i].v;
}
if(sum<m)//先判断一下所有的零钱加起来是否比期望值要大,如果所有的零钱加起来都没有期望值大的话直接输出No Solution
printf("No Solution\n");
else
{
sort(a,a+n,cmp);
dfs(0,0);
if(!flag)
printf("No Solution\n");
}
return 0;
}

776

被折叠的 条评论
为什么被折叠?



