一道基础的dfs剪枝优化,我做了好半天做不出来,其实就是明白题的意思,代码呼之欲出就是写不出来,最后写出来还TLE了。总之就是感觉自己太菜了,写篇题解纪念一下。
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+7;
int cat[N],cab[N],n,maxhold;
int cnt;
int ans=INT_MAX;
bool cmp(int a,int b)
{
return a>b;
}
void dfs(int now,int cnt)
{
if(cnt>=ans) return;
if(now==n+1)
{
ans=min(ans,cnt);
return;
}
for(int i=1;i<=cnt;i++)
{
if(cab[i]+cat[now]<=maxhold)
{
cab[i]+=cat[now];
dfs(now+1,cnt);
cab[i]-=cat[now];
}
}
cab[cnt+1]=cat[now];//开来一辆馨兰彻
dfs(now+1,cnt+1);
cab[cnt+1]=0;
}
int main()
{
cin>>n>>maxhold;
for(int i=1;i<=n;i++)
{
cin>>cat[i];
}
sort(cat+1,cat+n+1,cmp);
dfs(1,1);
cout<<ans;
}
灼烧手指,是对我无力的惩罚。
我掉入了暴力的陷阱,有些现成的条件没用上,只想着去开辟新的空间。
空间也要利用上。