zoukankan      html  css  js  c++  java
  • 【codevs4228】小猫爬山(最优化剪枝)

    problem

    • 给出n只猫及其重量ci
    • 每辆车载重不超过w
    • 用最少的车将猫运送到山底
    • n<=18

    solution

    1、n<=18,暴搜。
    2、关于答案:

    • 对于每只猫,要么用已有的缆车,要么新建一辆车。
    • 所以描述一个状态用:已运送多少只猫,已用多少量缆车,每辆已用的车载重多少。

    3、关于剪枝

    • 最优化剪枝:当发现cnt>=ans时,显然继续下去得不到更优的方案了。

    codes

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn = 50;
    int n, w, ans = 1e9;
    int a[maxn], cab[maxn];
    void dfs(int now, int cnt){
        if(cnt >= ans)return ;//最优化剪枝
        //运送完了
        if(now == n+1){
            ans = min(ans, cnt);
            return ;
        }
        //用已有的
        for(int i = 1; i <= cnt; i++){
            if(cab[i]+a[now]<=w){
                cab[i] += a[now];
                dfs(now+1,cnt);
                cab[i] -= a[now];
            }
        }
        //新建一辆
        cab[cnt+1] = a[now];
        dfs(now+1,cnt+1);
        cab[cnt+1] = 0;
    }
    int main(){
        cin>>n>>w;
        for(int i = 1; i <= n; i++)cin>>a[i];
        dfs(1,0);
        cout<<ans<<'
    ';
        return 0;
    }
  • 相关阅读:
    windows平台下一款强大的免费代理获取工具
    彻底搞懂Git Rebase
    line-height
    text-indent
    text-decoration
    text-align
    color
    CSS属性汇总
    font
    font-style
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444618.html
Copyright © 2011-2022 走看看