7219:复杂的整数划分问题

7219:复杂的整数划分问题

题目链接

#include<iostream>
using namespace std;
const int N = 50;
/*
标准的输入包含若干组测试数据。每组测试数据是一行输入数据,包括两个整数N 和 K。
(0 < N <= 50, 0 < K <= N)
输出
对于每组测试数据,输出以下三行数据:
第一行: N划分成K个正整数之和的划分数目     dp1 有1和无1
第二行: N划分成若干个不同正整数之和的划分数目   dp2 有n和无n
第三行: N划分成若干个奇正整数之和的划分数目   
*/
int dp1[55][55] = {
    
     0 }, dp2[55][55] = {
    
     0 };
int f[55][55] = {
    
     0 }, g[55][55] = {
    
     0 };//f奇数,g偶数

void solve() {
    
    
	for (int i = 1; i <= N; i++) {
    
    
		for (int j = 1; j <= N; j++) {
    
    
			if (i < j) {
    
    
				dp1[i][j] = 0;
				dp2[i][j] = dp2[i][i];
			}
			else if (i == j) {
    
    
				dp1[i][j] = 1;
				dp2[i][j] = dp2[i][j - 1] + 1;
			}
			else {
    
    
				dp1[i][j] = dp1[i - 1][j - 1] + dp1[i - j][j];//有1和无1
				dp2[i][j] = dp2[i - j][j-1] + dp2[i][j - 1]; //有j和无j
			}
		}
	}

	f[0][0] = 1, g[0][0] = 1;
	for (int i = 1; i <= N; i++) {
    
    
		for (int j = 1; j <= i; j++) {
    
    
			g[i][j] = f[i - j][j];
			f[i][j] = f[i - 1][j - 1] + g[i - j][j];
		}
	}

}
int main() {
    
    
	int n,k;
	solve();
	while (cin >> n >> k) {
    
    
		cout << dp1[n][k] << endl;
		cout << dp2[n][n] << endl;
		int sum = 0;
		for (int i = 1; i <= n; i++) {
    
    
			sum += f[n][i];
		}
		cout << sum<<endl;
	}
	return 0;
}

参考大佬的代码

猜你喜欢

转载自blog.csdn.net/weixin_46028214/article/details/113090187