鱼C论坛

 找回密码
 立即注册
查看: 4211|回复: 7

[争议讨论] 算法每日一题(七)——____递归与分治

[复制链接]
发表于 2011-7-9 23:03:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题:将一个整数n表示成一系列的正整数之和:
         n = n1+n2+n3+n4+......+nk( n1>=n2>=n3>=nk>=1,k>=1)
被称作正整数n的一个划分。一个正整数n可能存在着不同的划分,例如正整数6的全部的划分为:
6 = 6
6 = 5 + 1
6 = 4 + 2        6 = 4 + 1 + 1
6 = 3 + 3        6 = 3 + 2 + 1   6 = 3 + 1 + 1 + 1
6 = 2 + 2 + 2   6 = 2 +2 + 1 + 1     6 = 2 + 1 + 1 + 1 + 1
6 = 1 + 1 + 1 + 1 + 1 + 1

提示:本题应用到分治与递归的思想,这是一种占有重要地位的算法思想,无论是问题的抽象,还是对逻辑理解的深入。
同时与本题同类型的是2011年蓝点杯的选拔赛试题,大家可以好好研究下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-10 13:54:49 | 显示全部楼层
本帖最后由 风扫地 于 2011-7-10 13:56 编辑

占楼。。try一下。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-10 16:13:55 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>
#define N 1000
//存放划分出来的整数
//vec[0]为要划分的整数
int vec[N];

void work();
void getPartition(int n, int pos);
void print(int pos);
int main(){
        while(scanf("%d",vec)!=EOF) work();
}

void work(){
        getPartition(vec[0],1);
}
void getPartition(int n,int pos){
        if(n>0){
                int i;
                for(i=min(n,vec[pos-1]);i>0;--i){
                        vec[pos]=i;
                        getPartition(n-i,pos+1);
                }
        }
        else print(pos);
}

void print (int pos){
        int i;
        printf("%d=%d",vec[0],vec[1]);
        for(i=2;i<pos;++i) printf("+%d",vec[i]);
        printf("\n");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-10 16:16:38 | 显示全部楼层
。。。效率低了,没记录重复出现的子问题的解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-10 20:19:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-10 21:06:56 | 显示全部楼层
20110710492.jpg


20110710493.jpg


20110710494.jpg
20110710491.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-11 08:20:38 | 显示全部楼层
加上min的声明和实现
int main(int a, int b){return a<b?a:b;}即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2015-5-14 16:52:41 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 05:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表