题解:P10483 小猫爬山

思路

第一眼我以为是个背包,但由于是分组,所以有多个缆车,明显不能用背包。我做这题是因为老师要求,那是我们在学深搜减枝,所以我就开始写深搜。

这一题实际上是先选一直最重的猫,然后搞个 \(sum\) 数组,每搞一个新缆车的就下一个下标继续放,如果能放就放,当然也要搞一个能放但不放的。减枝就是如果当前所需缆车数量大于 \(minans\) 了,就返回。

具体代码很好写。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=101;
int n,w;
int v[N];
int sum[20];
int minans=INT_MAX;
void dfs(int id,int cnt){
    if(cnt>minans) return ;
    if(id>n){
        minans=min(minans,cnt);
        return ;
    }
    for(int i=1;i<=cnt;i++){
        if(w-sum[i]>=v[id]){
            sum[i]+=v[id];
            dfs(id+1,cnt);
            sum[i]-=v[id];
        }
    }
    sum[cnt+1]+=v[id];
    dfs(id+1,cnt+1);
    sum[cnt+1]-=v[id];
}
int main(){
    cin>>n>>w;
    for(int i=1;i<=n;i++) cin>>v[i];
    sort(v+1,v+n+1,greater<int>());
    dfs(1,0);
    cout<<minans;
    return 0;
}
posted @ 2024-12-19 19:43  zhouxi2022HZO  阅读(65)  评论(0)    收藏  举报