当前位置: 代码迷 >> C语言 >> C语言高手进来
  详细解决方案

C语言高手进来

热度:133   发布时间:2008-04-24 12:27:35.0
C语言高手进来
将正整数N拆分成K份(使K个数之和的等于N ),且每种拆分方案不能为空,任意俩种拆分方案不能相同(不考虑顺序)。列如:N=7,K=3,共4种拆分方法为;(1)1、1、5;(2)1、2、4;(3)1、3、3;(4)2、2、3。下面三种分法被认为是相同的:1、1、5;1、5、1;5、1、1;
编程任务;
给定的正整数N,分成K分,编程计算有多少种不同的分法。
数据输入;
输入数据只有一行2个数:N、K(6〈N〈=200,  2〈=K〈=6)。
结果输出;
输出数据是一个,有多少种不同的分法。
输入输出样列:
输入:7  3
输出 4
  对于一个自然数  ,可以把它转换成对应的二进制数  akak-1……a1a0 ,而且 ai=o 1 (0<=i<k),ak=1. 如 :10=(1010)2.   akak-1……a1a0=a0a1……ak-1ak,则称 为对称数 ,如5=(101)2。
编程任务:
对于一个给定的 n,求 1~n中A类对称数的个数。
数据输入:
输入数据只有1个,给出正整数n(1<n<=108)
结果输出:
输出数据也是一个,1~n 中A类对称数的个数。
输入输出样列:
输入:5               
输出:2              ak : k 为下标  其他的也一样 k-1 i 还有数字 1  0

[[it] 本帖最后由 jsvanyr 于 2008-4-24 22:13 编辑 [/it]]
搜索更多相关的解决方案: C语言  整数  拆分  数据  

----------------解决方案--------------------------------------------------------
典型的DP
记忆化搜索和递推都可以0ms AC
----------------解决方案--------------------------------------------------------
第二题格式乱的很(如下标等),看起来比较乱,请lz把第二题准确发一下
----------------解决方案--------------------------------------------------------
第一题:
程序代码:

#include<stdio.h>
int n,k;
int s[201][7]={0};
int main(void)
{
    int i,j;
    scanf("%d%d",&n,&k);
    s[1][1]=1;
    for(i=1;i<=n;i++)
      for(j=1;j<=k;j++)
        if(!(i==1 && j==1) && i-j>-1)
          s[i][j]=s[i-1][j-1]+s[i-j][j];
    printf("%d",s[n][k]);
    return 0;
}

----------------解决方案--------------------------------------------------------
第一题我之前发过的相关资料:http://program.xuntan.com/dispbbs.php?boardid=2&id=37&page=1
----------------解决方案--------------------------------------------------------
第二题粗略地看了一下,如果没看错,应该是直接构造二进制数然后转换就可以了.不过最后把正确格式的题发上来
----------------解决方案--------------------------------------------------------
回复 2# 的帖子
好了 把a写大点  k  什么的写小点 做下标就是了
----------------解决方案--------------------------------------------------------
是好题啊,上面的数主用二维做的也好啊,我要学习学习呢
----------------解决方案--------------------------------------------------------
  相关解决方案