動態規劃題解_將一個數字表示成冪的和的方案數【LeetCode】

2787. 將一個數字表示成冪的和的方案數

給你兩個整數?n?和?x?。

請你返回將?n?表示成一些?互不相同?正整數的?x?次冪之和的方案數。換句話說,你需要返回互不相同整數?[n1, n2, ..., nk]?的集合數目,滿足?n = n1x + n2x + ... + nkx?。

由于答案可能非常大,請你將它對?109 + 7?取余后返回。

比方說,n = 160?且?x = 3?,一個表示?n?的方法是?n = 23 + 33 + 53?。

示例 1:

輸入:n = 10, x = 2
輸出:1
解釋:我們可以將 n 表示為:n = 32 + 12 = 10 。
這是唯一將 10 表達成不同整數 2 次方之和的方案。

示例 2:

輸入:n = 4, x = 1
輸出:2
解釋:我們可以將 n 按以下方案表示:
- n = 41 = 4 。
- n = 31 + 11 = 4 。

一、算法邏輯(逐步思路)

? 題目描述:

給定兩個整數 nx,問:
有多少種方法可以用不同的正整數的 x 次冪相加,恰好等于 n

  • 每個整數最多使用一次(不能重復);
  • 返回方案數,結果對 10^9 + 7 取模。

? 解析過程:

1. 狀態定義:
  • 定義 f[s] 表示和為 s 的組合數目
  • 初始化:f[0] = 1,表示選法為空時和為 0 的唯一方案。
2. 狀態轉移:
  • 對每個正整數 i,計算它的 x 次冪 v = i^x
  • 使用這個數能更新哪些和 s
    • 遍歷 snv(倒序,防止重復使用);
    • 更新方式:f[s] += f[s - v]
      • 意思是:若當前組合中加入一個 v,使得和達到 s,那就看以前有多少種方法能組成 s - v
      • 相當于經典的0/1 背包模型(每個數最多使用一次)。
3. 終止條件:
  • 如果當前的 i^x > n,說明無法再用于任何組合,直接退出。
4. 返回值:
  • f[n] 表示最終組成 n 的合法組合數;
  • 對結果取模是為了防止整數溢出。

二、算法核心點

? 核心思想:0/1背包模型上的指數冪優化

  • 每個正整數 i 只能使用一次,對應背包問題中“每種物品最多取 1 次”;
  • 數字 v = i^x 就是物品的“體積”;
  • 每次用 f[s] += f[s - v] 實現狀態轉移;
  • 為避免重復計算、實現“每個數最多選一次”,必須倒序更新狀態數組。

對應題目經典名稱:

Perfect Powers Combination Problem(冪次組合計數)

class Solution:def numberOfWays(self, n: int, x: int) -> int:f = [1] + [0] * n  # 初始化DP數組:f[s] 表示組成和為 s 的方案數# 初始狀態:f[0] = 1,表示“和為0”的方案就是啥也不選for i in range(1, n + 1):  # 枚舉所有底數 i(1 到 n)v = i ** x  # 當前考慮的數是 i 的 x 次冪if v > n:   # 如果這個數太大,跳出循環break# 倒序遍歷(0/1背包)從 n 到 vfor s in range(n, v - 1, -1):f[s] += f[s - v]  # 轉移方程:將 v 加入組合中,組成 sreturn f[n] % 1_000_000_007  # 返回最終和為 n 的方案數

三、復雜度分析

  • 時間復雜度:O(k × n)
    • k 是最多可以選擇的整數個數(即 i 滿足 i^x ≤ n);
    • 對每個合法 i,我們進行一次 O(n) 的遍歷。
  • 空間復雜度:O(n)
    • 狀態數組 f 長度為 n + 1

總結表:

維度

內容

? 思路邏輯

將問題轉換為組合數問題,用 0/1 背包方式動態轉移

? 核心技巧

每個數最多用一次(倒序遍歷);冪次作為體積;經典 f[s] += f[s - v] 模型

? 時間復雜度

O(√n × n) 最多枚舉 √n 個底數,每次遍歷 n 個狀態

? 空間復雜度

O(n) 一維 DP 數組

總結思路:

步驟內容
初始化 f[0] = 1和為 0 有 1 種方式(空集)
枚舉 i = 1...n將 i 的 x 次冪作為候選數
倒序更新 DP 數組保證每個數最多用一次(0/1背包)
更新 f[s] += f[s - v]表示:新方案 = 舊方案 + 使用 v 的方案
取模避免大數溢出

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88880.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88880.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88880.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#常用的LinQ方法

LINQ(Language Integrated Query)是 .NET 中用于處理集合的強大工具,它提供了多種方法來簡化數據查詢和操作。以下是一些常用的 LINQ 方法及其功能:Where: 根據指定的條件篩選集合中的元素。var filteredResults matchResults.Wh…

目標檢測之數據增強

數據翻轉,需要把bbox相應的坐標值也進行交換代碼:import random from torchvision.transforms import functional as Fclass Compose(object):"""組合多個transform函數"""def __init__(self, transforms):self.transform…

DiffDet4SAR——首次將擴散模型用于SAR圖像目標檢測,來自2024 GRSL(ESI高被引1%論文)

一. 論文摘要 合成孔徑雷達(SAR)圖像中的飛機目標檢測是一項具有挑戰性的任務,由于離散的散射點和嚴重的背景雜波干擾。目前,基于卷積或基于變換的方法不能充分解決這些問題。 本文首次探討了SAR圖像飛機目標檢測的擴散模型&#…

html案例:編寫一個用于發布CSDN文章時,生成有關縮略圖

CSDN博客文章縮略圖生成器起因:之前注意到CSDN可以隨機選取文章縮略圖,但后來這個功能似乎取消了。于是我想調整一下縮略圖的配色方案。html制作界面 界面分上下兩塊區域,上面是參數配置,下面是效果預覽圖。參數配置: …

lightgbm算法學習

主要組件 Boosting #mermaid-svg-1fiqPsJfErv6AV82 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1fiqPsJfErv6AV82 .error-icon{fill:#552222;}#mermaid-svg-1fiqPsJfErv6AV82 .error-text{fill:#552222;stroke:#…

安卓基于 FirebaseAuth 實現 google 登錄

安卓基于 FirebaseAuth 實現 google 登錄 文章目錄安卓基于 FirebaseAuth 實現 google 登錄1. 前期準備1.1 創建 Firebase 項目1.2 將 Android 應用連接到 Firebase1.3 在 Firebase 控制臺中啟用 Google 登錄2. 在 Android 應用中實現 Google 登錄2.1 初始化 GoogleSignInClien…

李宏毅(Deep Learning)--(三)

一.前向傳播與反向傳播的理解:二.模型訓練遇到的問題在模型訓練中,我們可能會遇到效果不好的情況,那么我們應該怎么思考切入,找到問題所在呢?流程圖如下:第一個就是去看訓練的損失函數值情況。如果損失較大…

android studio 運行,偶然會導致死機,設置Memory Settings嘗試解決

1、android studio導致死機 鼠標不能動,鍵盤沒有反應,只能硬重啟,但是內存并沒有用完,cpu也不是100% 2、可能的原因 android studio內存設置的問題,為了限制占用內存,所以手工設置內存最小的一個&#x…

HTB 賽季8靶場 - Outbound

Rustscan掃描我們開局便擁有賬號 tyler / LhKL1o9Nm3X2,我們使用rustscan進行掃描 rustscan -a 10.10.11.77 --range 1-65535 --scan-order "Random" -- -A Web服務漏洞探查 我們以賬號tyler / LhKL1o9Nm3X2登錄webmail,并快速確認版本信息。該…

動態組件和插槽

[Vue2]動態組件和插槽 動態組件和插槽來實現外部傳入自定義渲染 組件 <template><!-- 回復的處理進度 --><div v-if"steps.length > 0" class"gain-box-header"><el-steps direction"vertical"><div class"l…

Unreal5從入門到精通之如何實現UDP Socket通訊

文章目錄 一.前言二.什么是FSocket1. FSocket的作用2. FSocket關鍵特性三.創建Socket四.數據傳輸五.線程安全六.UDPSocketComponentUDPSocketComponent.hUUDPSocketComponent.cpp七.SocketTest測試八.最后一.前言 我們在開發UE 的過程中,會經常使用到Socket通訊,包括TCP,UD…

UI前端大數據處理新趨勢:基于邊緣計算的數據處理與響應

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;前端大數據的 “云端困境” 與邊緣計算的破局當用戶在在線文檔中實時協作…

Reading and Writing to a State Variable

本節是《Solidity by Example》的中文翻譯與深入講解&#xff0c;專為零基礎或剛接觸區塊鏈開發的小白朋友打造。我們將通過“示例 解說 提示”的方式&#xff0c;帶你逐步理解每一段 Solidity 代碼的實際用途與背后的邏輯。Solidity 是以太坊等智能合約平臺使用的主要編程語…

c# 深度解析:實現一個通用配置管理功能,打造高并發、可擴展的配置管理神器

文章目錄深入分析 ConfigManager<TKey, TValue> 類1. 類設計概述2. 核心成員分析2.1 字段和屬性2.2 構造函數3. 數據加載機制4. CRUD 操作方法4.1 添加數據4.2 刪除數據4.3 更新數據4.4 查詢數據4.5 清空數據5. 數據持久化6. 設計亮點7. 使用示例ConfigManager<TKey, …

運維打鐵: Python 腳本在運維中的常用場景與實現

文章目錄引言思維導圖常用場景與代碼實現1. 服務器監控2. 文件管理3. 網絡管理4. 自動化部署總結注意事項引言 在當今的 IT 運維領域&#xff0c;自動化和效率是至關重要的。Python 作為一種功能強大且易于學習的編程語言&#xff0c;已經成為運維人員不可或缺的工具。它可以幫…

【零基礎入門unity游戲開發——unity3D篇】3D光源之——unity反射和反射探針技術

文章目錄 前言實現天空盒反射1、新建一個cube2、全反射材質3、增加環境反射分辨率反射探針1、一樣把小球材質調成全反射2、在小球身上加添加反射探針3、設置靜態物體4、點擊烘培5、效果6、可以修改反射探針區域大小7、實時反射專欄推薦完結前言 當對象收到直接和間接光照后,它…

React Three Fiber 實現 3D 模型點擊高亮交互的核心技巧

在 WebGL 3D 開發中&#xff0c;模型交互是提升用戶體驗的關鍵功能之一。本文將基于 React Three Fiber&#xff08;R3F&#xff09;和 Three.js&#xff0c;總結 3D 模型點擊高亮&#xff08;包括模型本身和邊框&#xff09;的核心技術技巧&#xff0c;幫助開發者快速掌握復雜…

卷積神經網絡實戰:MNIST手寫數字識別

夜漸深&#xff0c;我還在&#x1f618; 老地方 睡覺了&#x1f64c; 文章目錄&#x1f4da; 卷積神經網絡實戰&#xff1a;MNIST手寫數字識別&#x1f9e0; 4.1 預備知識?? 4.1.1 torch.nn.Conv2d() 三維卷積操作&#x1f4cf; 4.1.2 nn.MaxPool2d() 池化層的作用&#x1f4…

HarmonyOS應用無響應(AppFreeze)深度解析:從檢測原理到問題定位

HarmonyOS應用無響應&#xff08;AppFreeze&#xff09;深度解析&#xff1a;從檢測原理到問題定位 在日常應用使用中&#xff0c;我們常會遇到點擊無反應、界面卡頓甚至完全卡死的情況——這些都可能是應用無響應&#xff08;AppFreeze&#xff09; 導致的。對于開發者而言&am…

湖北設立100億元人形機器人產業投資母基金

湖北設立100億元人形機器人產業投資母基金 湖北工信 2025年07月08日 12:03 湖北 &#xff0c;時長01:20 近日&#xff0c;湖北設立100億元人形機器人產業投資母基金&#xff0c;重點支持人形機器人和人工智能相關產業發展。 人形機器人產業投資母基金由湖北省財政廳依托省政府…