首页 > 其他分享 >377. 组合总和 IV

377. 组合总和 IV

时间:2024-04-15 21:55:22浏览次数:27  
标签:台阶 target nums int dfs IV rm 377 总和

题目链接:

本题是爬楼梯的又一变式。
分析样例可知,每次选择的都可以是 \(\rm nums\) 中的任一个数,而最后选择完毕的数之和等于 \(\rm target\).

可以认为我们每次从 \(\rm nums\) 中选一个数作为往上爬的台阶数,问爬 \(\rm target\) 个台阶有多少种方案。

因此爬楼梯那个题可以认为是本题条件下 \(\rm nums = [1,2]\) 的一个特殊情况 ,因为每次只能爬 \(1\) 个或 \(2\) 个台阶。

实现一、记忆化搜索

定义 \(\rm dfs(i)\) 为爬 \(i\) 个台阶的方案数。考虑最后一步爬了 \(\rm x=nums[j]\) 个台阶,那么问题变成爬 \(i-x\) 个台阶的方案数,即 \(\rm dfs(i-x)\)。

所以有 \(\rm dfs(i)=\sum\limits_{j=0}^{n-1}dfs(i-nums[j])\)
(仅在 \(\rm nums[j] \leqslant i\) 时成立)

递归边界为 \(dfs(0)=1\),只有当不选取任何元素时,元素之和才为 \(0\),因此只有 \(1\) 种方案。或这样理解:爬 \(0\) 个台阶的方案数为 \(1\)。也可以这样理解:我们从 \(\rm target\) 往下爬,刚好爬到底部(递归边界)此时就找到了一个合法的方案,返回 \(1\)。

递归入口为 \(\rm dfs(target)\),也就是答案。

爬楼梯那个题的递推表示也可以由此来推出,即 \(\rm dfs(i)=dfs(i-1)+dfs(i-2)\)。

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        int n = nums.size();
        vector<int> memo(target + 1, -1);

        function<int(int)> dfs = [&] (int i) -> int {
            if (i == 0) return 1;
            int &res = memo[i];
            if (res != -1) return res;
            res = 0;
            for (auto x : nums) {
                if (x <= i) res += dfs(i - x);
            }
            return res;
        };
        return dfs(target);
    }
};

实现二、递推

注意这里需要开到 \(\rm unsigned\) \(\rm long\) \(\rm long\) 才可以。

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        int n = nums.size();
        vector<unsigned long long> f(target + 1);
        f[0] = 1;
        for (int i = 1; i <= target; i++) {
            for (auto x : nums) {
                if (x <= i) f[i] += f[i - x];
            }
        }
        return f[target];
    }
};

标签:台阶,target,nums,int,dfs,IV,rm,377,总和
From: https://www.cnblogs.com/pangyou3s/p/18136993

相关文章

  • react native调试相关技巧
    ReactNative的Debug基础:https://reactnative.dev/docs/next/debugging   调出开发菜单DevMenu。cmd+D或Device->Shake   在DevMenu上可以选择“ShowElementInspector”,显示UI上的组件,但是这是直接在app上显示,不清楚,最好在DevTools上来查看元素。 ......
  • ChromeDriver高版本下载
    chromedriver下载chromedriver114版本及以下的下载仓库地址:https://chromedriver.storage.googleapis.com/index.html chromedrvier从115版本开始从以前默认的仓库变成了新的地址发布:https://googlechromelabs.github.io/chrome-for-testing 新发布地址默认只列出......
  • 地铁查询系统Android,MainActivity
    packagecom.example.metro_info_front_end;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.ArrayAdapter;importandroid.widget.AutoCompleteTextView;importandroid.widget.Button;importandroid.widget.LinearLayout;importandroid......
  • Serial receiver
    Inmany(older)serialcommunicationsprotocols,eachdatabyteissentalongwithastartbitandastopbit,tohelpthereceiverdelimitbytesfromthestreamofbits.Onecommonschemeistouseonestartbit(0),8databits,and1stopbit(1).The......
  • Serial receiver and datapath
    Seealso:SerialreceiverNowthatyouhaveafinitestatemachinethatcanidentifywhenbytesarecorrectlyreceivedinaserialbitstream,addadatapaththatwilloutputthecorrectly-receiveddatabyte.out_byteneedstobevalidwhendoneis1,and......
  • TheKingsArmyDiv1
    Topcoder#区间dp考虑\(dp_{l,r,3}\)表示当前考虑区间\([l,r]\),上面一行全部\(H\)的最小代价,下面一行全部\(H\)的最小代价,上下都\(H\)的最小代价转移考虑每次将两段拼起来,或者从现有的拓展一个貌似有贪心做法,不太会喵~~~//Author:xiaruizeconstintN=2e2+10......
  • Linux架构30 Ansible jinja2模板, jinja2模板配置负载均衡, keepalived
    Ansiblejinja2模板一、Ansiblejinja2模板概述#什么是jinja2模板jinja2是Python的全功能模板引擎#Jinja2与Ansible啥关系Ansible通常会使用jinja2模板来修改被管理主机的配置文件等...在saltstack中同样会使用jinja2如果在100台主机上安装服务,每台服务的监听端口都不一样......
  • 27天【代码随想录算法训练营34期】第七章 回溯算法part03(● 39. 组合总和 ● 40.组合
    39.组合总和怎么才能避免重复?比现在数小的数就别append到path里面了,之前肯定都试过了classSolution:defcombinationSum(self,candidates:List[int],target:int)->List[List[int]]:result=[]candidates.sort()self.backtracking(cand......
  • Educational Codeforces Round 164 (Rated for Div. 2)
    目录写在前面ABCDEF写在最后写在前面比赛地址:https://codeforces.com/contest/1954本来有机会上大分但是唐了E没调出来呃呃。小号比大号分高了呃呃以后想休闲直接打大号了哈哈A数学。若要将\(n\)个位置全部涂成颜色\(i\),则一定要修改\(n-\operatorname{count}(i)\)......
  • 论文解读(Polynormer)《Polynormer: Polynomial-Expressive Graph Transformer in Linea
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]2024年4月14日17:13:41论文信息论文标题:Polynormer:Polynomial-ExpressiveGraphTransformerinLinearTime论文作者:论文来源:2024 aRxiv论文地址:download论文代码:download视屏讲解:click1-摘要图转换器(GTs)已经成为一种......