题意:传送门
题解:
n
n
n非常小,但是
c
,
w
c,w
c,w非常大,所以只能使用搜索来做,对于当前小猫要么做到已经有的车上,要么新上一个车,所以
d
f
s
dfs
dfs的状态就是两个
d
f
s
(
u
,
c
n
t
)
dfs(u,cnt)
dfs(u,cnt),
u
u
u表示当前到了第
u
u
u个小猫,
c
n
t
cnt
cnt表示已经有了多少个车,可以再开一个全局变量
s
u
m
[
N
]
sum[N]
sum[N]来存储车的状态,这样看上去再加个
i
f
(
c
n
t
>
a
n
s
)
r
e
t
u
r
n
0
;
if(cnt>ans){return\ 0};
if(cnt>ans)return 0;的优化但是仍然
T
T
T,可以明显看到重量大的小猫显然比重量较轻的小猫更难运送,可以优先搜索重量较大的小猫,也就是使得搜索树靠近根部的分支变少了,这样就可以
A
C
AC
AC了。
c
o
d
e
:
code:
code:
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int n,m,cat[N],sum[N],ans=N;
void dfs(int u,int k)
{
if(k>ans)return ;
if(u==n){
ans=min(ans,k);
return ;
}
for(int i=1;i<=k;i++){
if(sum[i]+cat[u]<=m){
sum[i]+=cat[u];
dfs(u+1,k);
sum[i]-=cat[u];
}
}
sum[k+1]=cat[u];
dfs(u+1,k+1);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&cat[i]);
sort(cat,cat+n);
reverse(cat,cat+n);
dfs(0,0);
printf("%d\n",ans);
return 0;
}