| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2002 人关注过本帖, 1 人收藏
标题:用C语言解决的算法问题
只看楼主 加入收藏
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:1 
各位给出的答案的都是高人 佩服啊

Only the Code Tells the Truth             K.I.S.S
2014-12-31 20:46
巧若拙
Rank: 4
来 自:宁波余姚
等 级:业余侠客
威 望:1
帖 子:159
专家分:273
注 册:2014-8-24
收藏
得分:2 
我尝试去理解5楼beyondyf的算法,并写了一个更为通用的算法,但无法理解beyondyf是怎么求长度为Tile[i]的地砖的数量的。还请beyondyf或其他网友指导一下,谢谢!
程序代码:
#include<stdio.h>
#include<malloc.h>
#include<math.h>

#define MAX 3

int Tile[MAX] = {1, 2, 3};

int NumTile(int n); //动态规划法

int main()
{
    int n;
    int *S;
   // scanf("%d", &n);
   n = 1;
    while (n != 10)
    {
        printf("s%d = %d\n", n, NumTile(n));
           n++;
    }
    
    return 0;
}


int NumTile(int n) //动态规划法
{
    int (*f)[MAX];//f[n][m]的含义为总长度为n,且最后一块地砖长度为Tile[m]的组合数量 
    int i, j, k, sum;
    
    f = (int (*)[MAX])calloc(n+1, sizeof(f[0]));

    for (i=0; i<MAX; i++)//总长度为Tile[i],且最后一块地砖长度为Tile[i]的组合只有1个 
        f[Tile[i]][i] = 1;
        
    for (i=1; i<=n; i++)//总长度 
    {
        for (j=0; j<MAX; j++)//最后一块地砖长度为Tile[j] 
        {
            k = 0;
            if (j == 0)
                k = 1;
            for (; k<MAX; k++)//最后一块地砖长度为Tile[k] 
            {
                if (i > Tile[j])
                {
                    f[i][j] += f[i-Tile[j]][k];//累积总长度为i,且最后一块地砖长度为Tile[k]的组合数量 
                }
            }
        }
    }

    for (sum=j=0; j<MAX; j++)
    {
        sum += f[n][j]; 
    }
    
    free(f);
    
    return sum;
}


[ 本帖最后由 巧若拙 于 2015-1-1 20:22 编辑 ]
2015-01-01 20:10
快速回复:用C语言解决的算法问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025187 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved