題意:傳送門
題解:非常小,但是非常大,所以只能使用搜索來做,對於當前小貓要麼做到已經有的車上,要麼新上一個車,所以的狀態就是兩個,表示當前到了第個小貓,表示已經有了多少個車,可以再開一個全局變量來存儲車的狀態,這樣看上去再加個的優化但是仍然,可以明顯看到重量大的小貓顯然比重量較輕的小貓更難運送,可以優先搜索重量較大的小貓,也就是使得搜索樹靠近根部的分支變少了,這樣就可以了。
#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;
}