CODEVS4228 小貓爬山(搜索樹“分支”數量上的剪枝)

題意:傳送門
題解:nn非常小,但是c,wc,w非常大,所以只能使用搜索來做,對於當前小貓要麼做到已經有的車上,要麼新上一個車,所以dfsdfs的狀態就是兩個dfs(u,cnt)dfs(u,cnt)uu表示當前到了第uu個小貓,cntcnt表示已經有了多少個車,可以再開一個全局變量sum[N]sum[N]來存儲車的狀態,這樣看上去再加個if(cnt>ans)return 0;if(cnt>ans){return\ 0};的優化但是仍然TT,可以明顯看到重量大的小貓顯然比重量較輕的小貓更難運送,可以優先搜索重量較大的小貓,也就是使得搜索樹靠近根部的分支變少了,這樣就可以ACAC了。
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章