CODEVS4228 小猫爬山(搜索树“分支”数量上的剪枝)

题意:传送门
题解: 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值