编程算法 - 划分数 代码(C)

划分数 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

题目: 有n个无区别的物品, 将它们划分成不超过m组, 求出划分方法数模M的余数.

例如: n=4的m=3个划分, result=4(1,1,2; 1,3; 2,2; 4)

使用动态规划(DP)方法,

n的m划分a, 如果每个i都有a, {a-1}的集合就是n-m的m划分; a=0时, 就是n的m-1划分.

递推公式: dp[i][j] = dp[i][j-i] + dp[i-1][j]

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.7.20
 *      Author: spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <stdio.h>
#include <memory.h>

class Program {
	static const int MAX_N = 100;
	int n=4, m=3;
	int M=10000;
	int dp[MAX_N+1][MAX_N+1];
public:
	void solve() {
		dp[0][0] = 1;
		for (int i=1; i<=m; ++i) {
			for (int j=0; j<=n; ++j) {
				if (j-i>=0) {
					dp[i][j]=(dp[i-1][j]+dp[i][j-i])%M;
				} else {
					dp[i][j]=dp[i-1][j];
				}
			}
		}
		printf("result = %d\n", dp[m][n]);
	}
};

int main(void)
{
	Program iP;
	iP.solve();

	return 0;
}

输出:

result = 4

时间: 2024-10-09 00:44:24

编程算法 - 划分数 代码(C)的相关文章

编程算法 - 组合数 代码(C)

组合数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 一个字符串的组合数, 如abc, 输出的是a, b, c, ac, ab, bc, abc, 即包含顺序的组合. 类似位(bit)的全排列, 如 001, 010, 100, 011, 101, 110, 111. 代码: /* * main.cpp * * Created on: 2014.7.20 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/

编程算法 - 旋转矩阵 代码(C)

旋转矩阵 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 输出旋转矩阵, 使矩阵是按对角线螺旋上升, 在输出规则确定以后, 就可以判断, 上升规律是, 行列相加为定值. 所以采用两次循环的方法, 并且上下矩阵, 分开输出. 如: 1 2 6 7 15 3 5 8 14 16 4 9 13 17 22 10 12 18 21 23 11 19 20 24 25 代码: /* * main.cpp * * Created on: 2014.6.12 *

编程算法 - 两个链表的第一个公共结点 代码(C)

两个链表的第一个公共结点 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动较长链表的指针, 使其到相同结点的距离的相同, 再同时移动两个链表的指针, 找到相同元素. 时间复杂度: O(n) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #i

编程算法 - 数字在排序数组中出现的次数 代码(C)

数字在排序数组中出现的次数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 统计一个数字在排序数组中出现的次数. 通过折半查找, 找到首次出现的位置, 再找到末次出现的位置, 相减即可. 时间复杂度O(logn). 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #inc

编程算法 - 二叉树的深度 代码(C)

二叉树的深度 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一棵二叉树的根节点, 求该树的深度. 依次选择最深的左右子树, 然后递归加1. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdlib.h> #include <

编程算法 - 判断二叉树是不是平衡树 代码(C)

判断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 判断该树是不是平衡二叉树. 二叉平衡树: 任意结点的左右子树的深度相差不超过1. 使用后序遍历的方式, 并且保存左右子树的深度, 进行比较. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <std

编程算法 - 第一个只出现一次的字符 代码(C)

第一个只出现一次的字符 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 在字符串中找出第一个只出现一次的字符. 字符是char类型, 所以匹配256种可能, 采用hash表, 计算出现的次数, 再找到第一次出现的字符. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #i

编程算法 - 数组中的逆序对 代码(C)

数组中的逆序对 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 在数组中的两个数字如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对. 输入一个数组, 求出这个数组中的逆序对的总数. 使用归并排序的方法, 辅助空间一个排序的数组, 依次比较前面较大的数字, 算出整体的逆序对数, 不用逐个比较. 时间复杂度: O(nlogn) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author:

编程算法 - 把数组排成最小的数 代码(C)

把数组排成最小的数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个正整数数组, 把数组里所有数字拼接起来排成一个数, 打印能拼接出的所有数字中最小的一个. 大数转换为字符串, 重载快速排序的比较方法, 进行排序, 最后拼接. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdi