深搜和DP方法解決數的劃分問題

2021-10-03 02:20:06 字數 1444 閱讀 4250

題目描述

積極探索太空的回報是豐厚的,因為魔法世界的科學家後來通過挖掘史前文明遺址發現,他們所在的星球,每隔一億五千萬年

左右就會發生一次由天外隕石或其他意外事件引發的物種大滅絕。稱霸星球一億多年的恐龍,就是因此而滅絕的。只有積極進

取,銳意創新的宇宙文明,才有可能躲過這場「天罰」。現在,天頂星人對魔法世界發動了大規模隕石攻擊,魔法世界的太空防禦

系統及時作出反應,將防禦能量n分成k份以對付k個隕石,已知每份不能為空(否則會被隕石擊中),任意兩份不能相同(不考

慮順序)。例如:n=7,k=3,下面三種分法被認為是相同的:1,1,5; 1,5,1; 5,1,1。問有多少種不同的分法。

輸入
n,k (6輸出乙個整數,即不同的分法。
樣例輸入
7 3
樣例輸出
4
深搜思路分析:

首先**題目規模2<=k<=6,規模不是很大,考慮到用深搜來做,依次列舉n以內的數字在k個格仔內填充,為了避免重複,確定順序從小到大進行填充。

ac **:

#include

using

namespace std;

int n,k,ans=0;

void

dfs(

int step,

int d,

int num)

//step表示列舉的數,d表示需要填充的格仔數,num即為要劃分的那個數

for(

int i=step;i<=num/d;i++)}

intmain()

這道題可以看成是將n個小球裝入到k個盒子裡面,每個盒子裡面至少有乙個小球,可以分成兩種狀態:

1、至少有乙個盒子內只有乙個球;

2、每個盒子裡的球的數量都大於1個;

兩種狀態之和即為所有狀態的情況。

設dp[i][j]表示將 i 個球裝入到 j 個盒子內,則狀態1可表示為dp[ i - 1 ][ j - 1 ];狀態2可表示為dp[ i - j ][ j ];

則可得到狀態轉移方程為dp[ i ][ j ]=dp[ i - 1][ j - 1]+dp[ i - j ][ j ];

話不多說,差不多就是這樣,上**:

ac **:

#include

using

namespace std;

int dp[

300]

[300];

intmain()

for(i=

2;i<=k;i++

)for

(i=2

;i<=n;i++)}

printf

("%d"

,dp[n]

[k])

;return0;

}

深搜剪枝 數的劃分

時間限制 1 sec 記憶體限制 128 mb 提交 16 解決 10 提交 狀態 討論版 命題人 add cy 將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同 不考慮順序 例如 n 7,k 3,下面三種劃分方案被認為是相同的。1 1 5 1 5 1 5 1 1 問有多少種不同的分法。n...

數的劃分問題 DP

問題 把乙個整數n分成k份,每份都不為0,有幾種分法?分析 情況分為兩類 一 每份中不包含1的方法,為保證每份 2,先拿出k個1到每乙份,然後把剩下的n k分為k份,分法有dp n k k 二 至少有乙份包含1,拿出1個當為乙份。剩下的n 1個分為k 1份,分法有dp n 1 k 1 include...

數的劃分問題總結 DP或遞迴

問題 1531 藍橋杯 演算法提高vip 數的劃分 時間限制 1sec 記憶體限制 128mb 提交 438 解決 175 題目描述 乙個正整數可以劃分為多個正整數的和,比如n 3時 3 1 2 1 1 1 共有三種劃分方法。給出乙個正整數,問有多少種劃分方法。資料規模和約定 n 100 輸入乙個正...