题解:#3288.小猫爬山 审核通过

lyh069 维什戴尔 2025-10-03 15:03:15 8

深搜题 dp应该也能做

题目:给你n只猫,每只猫有c的重量,现在再给你无限的缆车,每个缆车可以容下w的重量,并且每个缆车都要花费1元,问你需要多少钱

只需要用深搜把前u只小猫装进第k个缆车,如果有装不下的,就多买一个新缆车然后将旧缆车装不下的猫装进去继续深搜即可(详细见代码注释)

//不要抄袭
#include<bits/stdc++。h>
using namespace std;
const int N=1e300+7;
int a[N],sum[N];//sum:缆车
int n,ew;
int ans=114514191919; //定一个较大的数量防止取错
void dfs(int u,int k){ //u为第u只小猫 k为第k个缆车
    if(k>=ans) return; //剪枝,当现有的需要的缆车数量大于或等于之前搜出的最小需要的缆车时,直接弹出
    if(u==n+1){
        ans=min(ans,k);
        return}
//当把所有的猫装进去的时候,取需要缆车数量最小的值
    for(int i=1;i<=k;i++){
        if(sum[i]+a[u]<=w){
            sum[i]+=a[u]; 
            dfs(u+1,k);
            sum[i]-=a[u];//查询当前的所有缆车是否装的下第u只猫,装的下就接着查询下一只猫,最后搜完减去这只猫为后面缆车让位
        }
    }
    sum[k+1]=a[u];
    dfs(u+1,k+1);
    sum[k+1]=0; //增加一个新缆车,并将旧缆车装不下的猫装进去接着查询下一只猫,搜完再减去让位
}
int mxa1n(){
    cin>>n>>w;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    dfs(1,0);
    cout<<ans;
    return 0;
}

后面没了

{{ vote && vote.total.up }}