最大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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章