问题 B: 小猫爬山

题目

题解:本题是按车来搜索,前面cars辆车能否将cats只猫装完,不行就多一辆车,接着搜

#include <iostream>
#include <algorithm>
using namespace std;
int cmp(int a,int b){return a>b;}
bool visit[20]={false};
int weight ,n,w[20],sum[20],ans;///sum[i]第i辆车当前载重
void dfs(int cats,int cars)///小猫的数量,车的数量
{
    if(cars>=ans) return ;///剪枝,车数大于当前的最佳答案数,返回
    if(cats==n+1) {ans=min(ans,cars);return;}///递归边界,所有猫都装完了,更新答案
    for(int i=1;i<=cars;i++)///在当前使用的cars辆车当中搜索
    {
        if(w[cats]+sum[i]<=weight)///如果第cats只小猫能上第i辆车
        {
            sum[i]+=w[cats];///车放上猫
            dfs(cats+1,cars);///向猫数加一搜索
            sum[i]-=w[cats];///状态恢复,不放这只猫
        }
    }
    ///当没有车或者前面cars辆车搜索完时,换一辆车,载一只猫,往下搜索
    sum[cars+1]=w[cats];
    dfs(cats+1,cars+1);
    sum[cars+1]=0;///状态恢复
}
int main()
{
    cin>>n>>weight;
    for(int i=1;i<=n;i++) cin>>w[i];
    sort(w+1,w+n+1,cmp);///从重的猫先上车,可以提高dfs效率
    ans=n;
    dfs(1,0);
    cout << ans << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值