【每日算法Day 109】五大解法,带你深入了解完全背包方案数

简介: 给定数量不限的硬币,币值为 25 分、10 分、5 分和 1 分,编写代码计算 n 分有几种表示法。(结果可能会很大,你需要将结果模上 1000000007)

题目链接


LeetCode 面试题 08.11. 硬币[1]

题目描述


给定数量不限的硬币,币值为 25 分、10 分、5 分和 1 分,编写代码计算 n 分有几种表示法。(结果可能会很大,你需要将结果模上 1000000007)

说明:

  • 0 <= n (总金额) <= 1000000

示例1

输入:n = 5输出:2解释:有两种方式可以凑成总金额:5=55=1+1+1+1+1

示例2

输入:n = 10输出:4解释:有四种方式可以凑成总金额:10=1010=5+510=5+1+1+1+1+110=1+1+1+1+1+1+1+1+1+1

题解


image.png

朴素想法(错误)



image.png

动态规划 1



image.png

动态规划 2(超时)



image.png

转移方程优化


神奇的地方来了,上面两种方法,全部可以优化为同一个式子,仔细看好了。


动态规划 1:

image.png

动态规划 2:


image.png

最终形式:

image.png

空间优化


image.png

数学法


image.png

代码


动态规划 1(c++)

classSolution {
public:   
typedeflonglongll;   
staticconstllmod=1e9+7;  
staticconstintN=1000010;   
staticconstintM=4;
lldp[M][N];  
intp[M] = {1, 5, 10, 25};
intwaysToChange(intn) {    
memset(dp, 0, sizeofdp);   
for (inti=0; i<M; ++i) dp[i][0] =1; 
for (inti=0; i<M; ++i) {     
for (intj=1; j<=n; ++j) {    
for (intk=0; k<=i; ++k) {  
if (j>=p[k]) {     
                        (dp[i][j] +=dp[k][j-p[k]]) %=mod;   
                    }          
                }       
            }     
        }      
returndp[M-1][n];   
    }
};

动态规划 2(超时)(c++)

classSolution {
public:   
typedeflonglongll;   
staticconstllmod=1e9+7;   
staticconstintN=1000010;   
staticconstintM=4;
lldp[M][N];  
intp[M] = {1, 5, 10, 25};
intwaysToChange(intn) {  
memset(dp, 0, sizeofdp);  
for (inti=0; i<M; ++i) dp[i][0] =1;   
for (inti=0; i<=n/p[0]; ++i) dp[0][i*p[0]] =1;        
for (inti=1; i<M; ++i) {   
for (intj=1; j<=n; ++j) {     
for (intk=0; k<=j/p[i]; ++k) {  
                    (dp[i][j] +=dp[i-1][j-k*p[i]]) %=mod;                 }      
            }    
        }     
returndp[M-1][n]; 
    }
};

转移方程优化(c++)

classSolution {
public:  
typedeflonglongll; 
staticconstllmod=1e9+7;  
staticconstintN=1000010;   
staticconstintM=4;
lldp[M][N];  
intp[M] = {1, 5, 10, 25};
intwaysToChange(intn) {   
memset(dp, 0, sizeofdp); 
for (inti=0; i<M; ++i) dp[i][0] =1; 
for (inti=0; i<=n/p[0]; ++i) dp[0][i*p[0]] =1;        for (inti=1; i<M; ++i) {      
for (intj=1; j<=n; ++j) {    
dp[i][j] =dp[i-1][j];     
if (j>=p[i]) (dp[i][j] +=dp[i][j-p[i]]) %=mod;
            }      
        }     
returndp[M-1][n]; 
    }
};

空间优化(c++)

classSolution {
public:  
typedeflonglongll;
staticconstllmod=1e9+7;
staticconstintN=1000010;   
staticconstintM=4;
lldp[N];   
intp[M] = {1, 5, 10, 25};
intwaysToChange(intn) { 
memset(dp, 0, sizeofdp);   
dp[0] =1;      
for (intj=0; j<M; ++j) {       
for (inti=1; i<=n; ++i) {    
if (i>=p[j]) {    
                    (dp[i] +=dp[i-p[j]]) %=mod;   
                }      
            }    
        }    
returndp[n]; 
    }
};

数学法(c++)

classSolution {
public: 
typedeflonglongll;  
staticconstllmod=1e9+7;
intwaysToChange(intn) {  
llres=0;   
for (inti=0; i<=n/25; ++i) {    
llr=n-25*i; 
llx=r/10, y=r/5;  
            (res+= (x+1) * (y-x+1)) %=mod; 
        }     
returnres;  
    }
};

参考资料

[1]

LeetCode 面试题 08.11. 硬币: https://leetcode-cn.com/problems/coin-lcci/

image.png

作者简介:godweiyang知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~


相关文章
|
6月前
|
人工智能 算法 测试技术
【数学】【排序】【C++算法】3027人员站位的方案数
【数学】【排序】【C++算法】3027人员站位的方案数
|
11天前
|
传感器 人工智能 监控
智慧电厂AI算法方案
智慧电厂AI算法方案通过深度学习和机器学习技术,实现设备故障预测、发电运行优化、安全监控和环保管理。方案涵盖平台层、展现层、应用层和基础层,具备精准诊断、智能优化、全方位监控等优势,助力电厂提升效率、降低成本、保障安全和环保合规。
智慧电厂AI算法方案
|
11天前
|
传感器 人工智能 监控
智慧化工厂AI算法方案
智慧化工厂AI算法方案针对化工行业生产过程中的安全风险、效率瓶颈、环保压力和数据管理不足等问题,通过深度学习、大数据分析等技术,实现生产过程的实时监控与优化、设备故障预测与维护、安全预警与应急响应、环保监测与治理优化,全面提升工厂的智能化水平和管理效能。
智慧化工厂AI算法方案
|
28天前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
35 0
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
52 6
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
50 1
|
3月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
61 1
|
3月前
|
存储 算法 调度
基于和声搜索算法(Harmony Search,HS)的机器设备工作最优调度方案求解matlab仿真
通过和声搜索算法(HS)实现多机器并行工作调度,以最小化任务完成时间。在MATLAB2022a环境下,不仅输出了工作调度甘特图,还展示了算法适应度值的收敛曲线。HS算法模拟音乐家即兴创作过程,随机生成初始解(和声库),并通过选择、微调生成新解,不断迭代直至获得最优调度方案。参数包括和声库大小、记忆考虑率、音调微调率及带宽。编码策略将任务与设备分配映射为和声,目标是最小化完成时间,同时确保满足各种约束条件。
|
3月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
55 0
|
3月前
|
存储 算法 Java
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
39 0
下一篇
无影云桌面