zoukankan      html  css  js  c++  java
  • 38-整数划分

    http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=90

                整数划分

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:3
     
    描述
    将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 
    其中n1≥n2≥…≥nk≥1,k≥1。 
    正整数n的这种表示称为正整数n的划分。求正整数n的不 
    同划分个数。 
    例如正整数6有如下11种不同的划分: 
    6; 
    5+1; 
    4+2,4+1+1; 
    3+3,3+2+1,3+1+1+1; 
    2+2+2,2+2+1+1,2+1+1+1+1; 
    1+1+1+1+1+1。 

     
    输入
    第一行是测试数据的数目M(1<=M<=10)。以下每行均包含一个整数n(1<=n<=10)。
    输出
    输出每组测试数据有多少种分法。
    样例输入
    1
    6
    样例输出
    11
    来源
    [苗栋栋]原创
    上传者
    苗栋栋
    哇,最近多久没刷题了,真的没手感了。
    感觉控制条件很多种,要把握本质:
     
    #include <bits/stdc++.h>
    using namespace std;
    
    int dp[15][15]; //dp[i][j]表示不超过j的i的划分种数
    
    int find(int n, int m){
    	if(n < 0 || m < 0)
    		return 0;
    	if(m == 1 || (n == 0 && m > 0)){
    		return dp[n][m] = 1;
    	} 
    	if(dp[n][m]){  //如果已经填充过,不需要再次进行 
    		return dp[n][m];
    	}
    	return dp[n][m] = find(n - m, m) + find(n, m - 1);
    }
    
    int main(){
    	int t;
    	cin >> t;
    	while(t--){
    		int n;
    		memset(dp, 0, sizeof(dp));
    		cin >> n;	
    		cout << find(n, n) << endl;
    	}
    	return 0;
    } 
            
    

      

    #include <iostream>
    using namespace std;
    int dp[105][105];
    
    //将n划分成若干正整数之和的划分数 
    int fun1(int i, int j){
    	if(i < 0 || j < 0)
    		return 0;
    	if(i < j)   		
    		return dp[i][j] = fun1(i, i);  
    	if(dp[i][j])
    		return dp[i][j];
    //	if(i == j){
    //		return dp[i][j] = 1 + fun1(i, j - 1);
    //	} 
    	if(i == 0 || i == 1 || j == 1)
    		return dp[i][j] = 1;
    	return dp[i][j] = fun1(i - j, j) + fun1(i, j - 1);
    }
    
    int main(){
    	int n, k, t;
    	fun1(100, 100);
    	n = 100;
    	cin >> t;
    	while(t--){
    		cin >> n;
    		cout << dp[n][n] << endl;
    	}
    	return 0;
    } 
    

      

    #include <iostream>
    using namespace std;
    int dp[105][105];
    
    //将n划分成若干正整数之和的划分数 
    int fun1(int i, int j){
    	if(i < 1 || j < 1)
    		return 0;
    	if(i < j)   		
    		return dp[i][j] = fun1(i, i);  
    	if(dp[i][j])
    		return dp[i][j];
    	if(i == j){
    		return dp[i][j] = 1 + fun1(i, j - 1);
    	} 
    	if(i == 1 || j == 1)
    		return dp[i][j] = 1;
    	return dp[i][j] = fun1(i - j, j) + fun1(i, j - 1);
    }
    
    int main(){
    	int n, k, t;
    	fun1(100, 100);
    	n = 100;
    	cin >> t;
    	while(t--){
    		cin >> n;
    		cout << dp[n][n] << endl;
    	}
    	return 0;
    } 
    

      

  • 相关阅读:
    响应码异常HttpStatus not ok!statusCode:307
    SpringBoot的web项目使用JRebel启动错误
    SpringBoot启动遇到的找不到spring模块的怪事
    Redis(一)
    Redis一主二从Sentinel监控配置
    Redis命令
    IDEA
    sql server常用函数积累
    char,varchar和nvarchar有什么区别?
    SQL SERVER里的锁机制
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/9154562.html
Copyright © 2011-2022 走看看