首页 > 其他分享 >165. 小猫爬山

165. 小猫爬山

时间:2023-05-05 17:25:11浏览次数:37  
标签:cnt 小猫 idx int 爬山 return 缆车 ans 165

题目描述

每辆缆车承重一样,每个猫重量不一,最少需要多少缆车把猫运下山?

f1-深搜+减枝

基本分析

  1. 怎么考虑搜索?对当前的猫来说,有当前开的缆车个数+新缆车几种选择
  2. 状态空间有哪些维度?当前用到的缆车个数,当前正在处理的猫的id
  3. 哪些可额能的减枝方式?(1)优化搜索顺序:从大到小;(2)最优性:>=ans的结果不考虑了,直接return

代码

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 20;

int n, w;
int sum[N], cat[N];
int ans = N;

// 当前开了多少缆车?处理到索引多少的猫?
void dfs(int cnt, int idx)
{
    if (cnt >= ans)
        return;
        
    if (idx == n)
    {
        ans = min(ans, cnt);
        return;
    }
    
    // 枚举可以放在哪个缆车上
    for (int i = 0; i < cnt; i++)
    {
        if (sum[i] + cat[idx] <= w)
        {
            //维护-向下-还原
            sum[i] += cat[idx];
            dfs(cnt, idx + 1);
            sum[i] -= cat[idx];
        }
    }
    //还可以开新的
    sum[cnt] = cat[idx];
    dfs(cnt + 1, idx + 1);
    sum[cnt] = 0;
}

int main()
{
    scanf("%d%d", &n, &w);
    
    for (int i = 0; i < n; i++)
        scanf("%d", &cat[i]);
    
    dfs(0, 0);
    
    printf("%d\n", ans);
    
    return 0;
}

总结

  1. 明确状态空间需要定义的维度
  2. 注意作用域

标签:cnt,小猫,idx,int,爬山,return,缆车,ans,165
From: https://www.cnblogs.com/zk-icewall/p/17374691.html

相关文章

  • CF1656F Parametric MST 题解
    为了便于解题,先对\(a\)数组从小到大进行排序。首先,根据定义可以得出总价值的表达式:\[\begin{aligned}W&=\sum\limits_{(u,v)\inE}[a_ua_v+t(a_u+a_v)]\\&=\sum\limits_{(u,v)\inE}a_ua_v+t\sum\limits_{(u,v)\inE}(a_u+a_v)\end{aligned}\]接着,我们需要发现一个比较......
  • 运输小猫
    题目传送门考虑每只小猫是否能被接到、等待时间,其实在于\(start+d_2+d_3+\dots+d_i\)的值,如果\(\get_i\),即出发时间加上这些距离晚于\(t_i\)。可以将\(d\)移过来,那么每只小猫都可以用一个数\(a_i\)来衡量了。对于\(a\)排序,即可以划分成最多饲养员数量\(p\)的组数。......
  • Ubuntu操作系统纯内网环境搭建ntp时钟同步服务器//京鸿通信/www.kyohoon.com/15507589
    一、环境准备   服务器:192.168.10.181(Ubuntu操作系统)   客户端:192.168.10.82 (Ubuntu操作系统)  所有服务器均不能访问互联网二、ntp服务器端操作:   (1).现在服务器端安装ntp服务器安装包,首先需要在172.16.20.129服务器上准备好ntp安装包。并进行安装ntp......
  • android系统adb对时//京鸿通信/www.kyohoon.com/15507589165
    目录1、远程连接设备2、设置地区3、设置对时服务器4、重启设备5、查看对时服务器是否设置成功1、远程连接设备adbconnectxxx.xxx.xxx.xxx2、设置地区adbshellsetproppersist.sys.timezoneAsia/Shanghai3、设置对时服务器adbshellsettingsputglobalntp_server172.16.......
  • 20230415运动之白云洞爬山
      爬到山顶,就是为了吃碗素面,感受不一样的风景!   ......
  • 1650显卡和1060比较
    1060显卡可以被称之为最有性价比的显卡了,我们到现在还可以使用这些显卡去游玩很多游戏,而作为后出的1650显卡他的性能又是如何呢,我们今天就来比较一下。1650显卡和1060比较:1、游戏性能在游戏性能这方面两款显卡都差不多,不过1060的核心时钟速度要比1650好,所以在游戏纹理映射方面......
  • UVA1650 数字串 Number String
    对于任意一个只含数字1~n的有序数字串{a1,a2,……,an},比较数字串中所有相邻数字的大小,后者大于前者的用I表示,否则用D表示。例如,数字串{3,1,2,7,4,6,5},{2,1,3,7,4,6,5}和{3,1,2,7,5,6,4}就表示为'DIIDID'。"?"则表示两数的关系未知。例如,'?D'既有可能是ID,也有可能是‘DD’。现给出......
  • 1653. 使字符串平衡的最少删除次数
    题目链接:1653.使字符串平衡的最少删除次数方法:动态规划解题思路对于字符串\(s\),设使得字符串\(s[0,i]\)平衡的最小删除次数为\(dp[i]\)。若\(s[0,n-2]\)为平衡字符串,当\(s[n-1]==b\)时,则\(dp[n-1]=dp[n-2]\);当\(s[n-1]==a\)时,则\(dp[n-1]=min(dp[n-2]+1\),\(a\)......
  • POJ - 1651 Multiplication Puzzle(区间dp)
    题目大意:给你N个数,每次可以选择一个数进行剔除(第一个和最后一个不能选择),选出该数后,sum+=该数左边的数*该数*该数右边的数问最小的sum是多少解题思路:用dp[i][j]表示[i,j]区间被剔除得只剩下i,j的最小sumdp[i][j]=dp[i][k]+dp[k][j]+num[i]*num[k]*num[j]#include......
  • 1658. 将 x 减到 0 的最小操作数
    题目描述给一个整数数组nums和整数x需要从数组的左边或者右边删除元素,然后用x减去删除的元素问如果x刚好成删到0,怎么删最短?f1-反向思考+双指针基本分析反向思考?找一个最长的子数组满足和=sum(nums)-x为啥可以双指针?(1)元素都是整数,序列和是单调的;(2)元素连续代码def......