最大k乘积(动态规划、n重for循环用while实现)

问题描述:

        设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。

编程任务:

       对于给定的I 和k,编程计算I 的最大k 乘积。

Input

        输入的第1 行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10)

Output

        计算出的最大k乘积。

Input:

        5 3

        54321

Output:

        6420


动态规划、n重for循环用 while (1) 结构实现

/*************************************************************************
    > File Name: max_k.c
    > Author: zhanglp
    > Mail: [email protected]
    > Created Time: 2013年11月17日 星期日 20时19分11秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define MAX_BUFFER  128

int main (void)
{
    char    str_num[MAX_BUFFER];
    char    buf[MAX_BUFFER];
    int     i, j, k;

    printf ("please input num : ");
    for (i= 0; isdigit (str_num[i] = getchar ()); i++) ;
    str_num[i] = 0;

    int     n = i;
    int     w[n][n];
    memset ((char *)&w, 0, sizeof (w));

    do {
        printf ("please input k : ");
        scanf ("%d", &k);
    }while (k > n);

    for (i = 0; i < n; i++)
        for (j = i; j < n; j++) {
            strcpy (buf, str_num);
            buf[j+1] = 0;
            sscanf (buf+i, "%d", &w[i][j]);
        }
/*
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++)
            printf ("%-8d", w[i][j]);
        printf ("\n");
    }
*/

#if 0
    // 有 k 重 for 循环
    int     s = 0, max = 0;
    for (i = 0; i < n; i++)
        for (j = i+1; j < n; j++)
            for (k = j+1; k < n; k++)
            {
                printf ("(%d, %d, %d)\n", i, j, k);
                s = w[0][i] * w[i+1][j] * w[j+1][k];
            //    printf ("(%d, %d) * (%d, %d) * (%d, %d)\n", 0, i, i+1, j, j+1, k);
                if (s > max)
                    max = s;
            }
#endif


#if 1
    int     s = 0, max = 0;
    int     xunhuan[k+1];

    for (i = 0; i <= k; i++)
        xunhuan[i] = i-1;

    while (1) {

        for (s = 1, i = 1; xunhuan[k] < n && i <= k; i++)
            s *= w[xunhuan[i-1]+1][xunhuan[i]];
        if (s > max) max = s;

        int     kk = k;
        while (kk > 0) {
            if (xunhuan[kk] < n-1) {
                xunhuan[kk]++;
                break;
            }
            else {
                xunhuan[kk] = xunhuan[kk-1]+2;
                kk--;
            }
        }

        if (kk <= 0)
            break;
    }

#endif
    printf ("max = %d\n", max);

    return 0;
}

发布了65 篇原创文章 · 获赞 9 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章