动态规划_百炼 4117 简单的整数划分问题

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <stdlib.h>
 6 #include <vector>
 7 #include <map>
 8 #include <queue>
 9 #include <string>
10 #include <iostream>
11 #include <ctype.h>
12 #include <string.h>
13 #include <set>
14 #include <stack>
15 #include<functional>
16 using namespace std;
17 #define Size 55
18 #define maxn  1<<30
19 int dp[Size][Size];
20 /*
21 dp[i][j] 表示将i分解成不大于j的能分解的个数
22 dp[i][j]=dp[i][j-1]+dp[i-j][j]//因为数字可以重复  那么即使去掉了一个j 那么最大的数还有可能是j
23 当i-j<0 dp[i][j]=dp[i][j-1]
24 出口
25 dp(1,1)=1=dp(1,0)+dp(0,1)
26 dp(2,1)=1(1,1)=dp(2,0)+dp(1,1)
27 所以dp(i,0)=0  dp(0,j)=1;
28 */
29 int solve(int n, int m){
30     if (dp[n][m] != -1) return dp[n][m];
31     if (n == 0) {
32         dp[n][m] = 1;
33         return 1;
34     }
35     if (m == 0) {
36         dp[n][m] = 0;
37         return 0;
38     }
39     if (m > n) {
40         dp[n][m]= solve(n, m-1);
41         return dp[n][m];
42     }
43
44     dp[n][m]=solve(n , m-1) + solve(n-m, m);
45     return dp[n][m];
46
47 }
48 int main(){
49     int n;
50     while (cin >> n){
51         for (int i = 0; i <= n; i++)
52             for (int j = 0; j <= n; j++)
53                 dp[i][j] = -1;
54         cout << solve(n, n) << endl;
55     }
56     system("pause");
57     return 0;
58 }

原文地址:https://www.cnblogs.com/MapReduce/p/8372192.html

时间: 2024-11-03 14:46:14

动态规划_百炼 4117 简单的整数划分问题的相关文章

7215:简单的整数划分问题

总时间限制: 100ms 内存限制: 65536kB描述将正整数n 表示成一系列正整数之和,n=n1+n2+-+nk, 其中n1>=n2>=->=nk>=1 ,k>=1 .正整数n 的这种表示称为正整数n 的划分.正整数n 的不同的划分个数称为正整数n 的划分数. 输入标准的输入包含若干组测试数据.每组测试数据是一个整数N(0 < N <= 50).输出对于每组测试数据,输出N的划分数.样例输入5样例输出7提示5, 4+1, 3+2, 3+1+1, 2+2+1,

简单的整数划分问题 ( 北京大学ACM-ICPC竞赛训练暑期课 )

描述 将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 .正整数n 的这种表示称为正整数n 的划分.正整数n 的不同的划分个数称为正整数n 的划分数. 输入标准的输入包含若干组测试数据.每组测试数据是一个整数N(0 < N <= 50).输出对于每组测试数据,输出N的划分数.样例输入 5 样例输出 7 提示5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1 #i

动态规划_百炼4120 硬币

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include

动态规划_百炼 4121 股票买卖

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include

动态规划_百炼4122 切割回文

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include

动态规划_百炼 1088 滑雪

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include

动态规划_百炼1664 放苹果

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include

hdu1028(整数划分问题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1028 整数划分问题 整数划分 --- 一个老生长谈的问题: 描述 整数划分是一个经典的问题.请写一个程序,完成以下要求. 输入 每组输入是两个整数n和k.(1 <= n <= 50, 1 <= k <= n) 输出 对于输入的 n,k; 第一行: 将n划分成若干正整数之和的划分数. 第二行: 将n划分成k个正整数之和的划分数. 第三行: 将n划分成最大数不超过k的划分数. 第四行: 将

动态规划_基础_任意子区间序列求和问题_滑动窗口解法_多种思路_分治思想演变

题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入描述 第一行是一个正整数 N ( 1 ≤ N ≤ 200000 ) ,表示了序列的长度. 接下来的 N 行包含 N 个绝对值不大于 10000 的整数 A [ i ] ,描述了这段序列. 输出描述 仅包括 1 个整数,为最大的子段和是多少,子段的最小长度为 1 . 样例输入 72-43-12-43 样例输出 4 Hint Origin: SidneyEdit by stdKonjac in 2020 解题思路: 关于求子区间求