演算法 Rod Cutting Problem

 avatar
user_6817964
c_cpp
2 years ago
1.4 kB
2
Indexable
#include <stdio.h>
#define _CRT_SECIURE_NO_WARNINGS

int main()
{
    int k;
    scanf_s("%d", &k);
    int r[100], s[100], p[100]; // r:最大總價格 s:第一刀的長度

    for (int i = 1; i <= k; i++) {
        scanf_s("%d", &p[i]);
    }
    r[0] = 0;

    for (int j = 1; j <= k; j++) {
        int q = -1;
        for (int i = 1; i <= j; i++) {
            if (q < (p[i] + r[j - i])){
                q = p[i] + r[j - i];
                s[j] = i;
            }
        }
        r[j] = q;
    }
    
    printf("%d\n", r[k]); // 最大總價格

    int index_k = k, cut_total = 1; // cut_total:總共切幾刀
    int cut_index[100], i = 1; // cut_index:每一刀切多長

    if (index_k - s[index_k] == 0)  // 只切一刀
    {
        printf("1\n");
        printf("%d=%d", k, k);
    }
    else 
    {
        cut_total++;
        cut_index[i] = s[index_k];
        i++;
        index_k = index_k - s[index_k];
        while (index_k - s[index_k] != 0) {
            cut_total++;
            cut_index[i] = s[index_k];
            i++;
            index_k = index_k - s[index_k];
        }
        cut_index[i] = s[index_k];

        printf("%d\n", cut_total);
        printf("%d=%d", k, cut_index[1]);
        for (i = 2; i <= cut_total; i++) {
            printf("+%d", cut_index[i]);
        }
    }



}

Editor is loading...