將整數 n 分成 k 份,且每份不能為空,任意兩個方案不相同(不考慮順序)例如:n=7,k=3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1
問有多少種不同的分法。
第一行有兩個整數 n,k (61 個整數,即不同的分法個數。
sample input
7 3sample output4
dfs(n,k)求解的是n劃分為k個整數的劃分數。nn==k時,為1。
k==1時,為1。
考慮劃分的這k個數不包含1或包含1,則dfs(n,k)可由dfs(n-1,k-1)+dfs(n-k,k)擴充套件而來。dfs(n-k,k)可劃分的每個數都加1,這樣n劃分的k個數就不會包含1。
ac**
#include#include#includeusing namespace std;
int dfs(int n, int k)
void solve()
int main()
就是將上面的dfs思路轉化為dp實現。詳細見**。#include #include #include #include #include #include #include #include #include #include #include #define cla(a, sum) memset(a, sum, sizeof(a))
#define rap(i, m, n) for(int i=m; i<=n; i++)
#define rep(i, m, n) for(int i=m; i>=n; i--)
#define bug printf("???\n")
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pairp;
typedef pairpl;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const int mod=998244353;
const int maxn = 3e4;
const int n=1e5;
template void read(t &x)
while (isdigit(ch))
x *= f;
}ll dp[205][10]=,n,k;
int main()
} ll ans=dp[n][k];
cout
}
計蒜客 劃分整數(dp)
劃分整數 蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 nn n 分解成不多於 kk k 個正整數相加的形式,那麼一共有多少種分解的方式呢?蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。共一行,包含兩個整數 n 1 n 300 n 1 leq n leq 300 n 1 n ...
計蒜客 基礎dp 劃分整數
蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 n 分解成不多於 k 個正整數相加的形式,那麼一共有多少種分解的方式呢 蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。共一行,包含兩個整數 n 1 n 300 和 k 1 k 300 含義如題意所示。乙個數字,代表所求的方案數。樣...
計蒜客 劃分整數(動態規劃)
劃分整數 蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 nnn 分解成不多於 kkk 個正整數相加的形式,那麼一共有多少種分解的方式呢?蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。輸入格式 共一行,包含兩個整數 n 1 n 300 n 1 leq n leq 300 n 1...