找到整数的最小数字

时间:2015-08-08 05:58:23

标签: algorithm recursion dynamic-programming

给出一个n位数和一个数字' k'您必须从数字中删除“k”数字,并从剩余的“n-k”数字中给出最短的数字,以使数字序列保持相同。例如,如果数字是637824且k = 3.那么您必须从给定数字中删除3位数。由剩余数字组成的数字应尽可能小,并且不得更改数字序列。所以输出应该是324。

我使用与包含排除逻辑相同的方法:

输入63119和K = 2:

选择9 +最小值(6311)= 19或 不要选择9,选择1 +最小(631)= 11,最后选择最少

对于输入4567813和k = 3:

选择3和1以及最小值(45678)= 413

我正在使用递归逻辑来实现这一点,但我无法用代码实现这一点,而且现在我已经用力了。我需要这个递归的帮助。我不是更好的解决方案。

    #define min(a, b) ((a)>(b)?(b):(a));

    int minimum(char *s, int i, int j)
    {
            if (i == j)
                    return s[i] - '0';
            return min(s[j]-'0', minimum(s, i, j-1));
    }

    int add_up(char *s, int i, int j)
    {
            int sum = 0, mul = 1;
            while(i < j) {
                    sum = sum + (s[j] - '0')*mul;
                    j--;mul *= 10;
            }
            return sum;
    }

    int foo(char *s, int size, int j, int k)
    {
            int sum = 0, i, mul = 1;
            if (k < 0 || j > size || j < 0)
                    return 0;
            if ((k == 0) && (j != 0))
                    return add_up(s, 0, j);
            if ((k == 1) && (j != 0))
                    return minimum(s, 0, j);
            if (k-1 == j)
                    return add_up(s, 0, j);
            for (i=k;i>=0;i--) {
                    sum += min((s[j]-'0')+10*foo(s, size, j-1, k-1), foo(s, size, j-1, k));
            }
            return sum;
    }

    int main()
    {
            char s[] = {"4567813"};
            printf("%d\n", foo(s, strlen(s)-1, strlen(s)-1, 2));
            return 0;
    }

1 个答案:

答案 0 :(得分:1)

你已经说过最终采取最低限度,但你已经采取了最低限度,然后添加它们。您需要为每个i取最小值,并在sum中保存最小值。请参阅代码以获得澄清。您的add_up函数中也存在错误,应该添加到i<=j

int add_up(char *s, int i, int j)
{
    int sum=0, mul=1;
    while(i <= j) {  // modification here
        sum=sum + (s[j] - '0')*mul;
        j--; mul*=10;
    }
    return sum;
}

int foo(char *s, int size, int j, int k)
{
    int sum=INT_MAX, i, mul=1;
    if(k < 0 || j > size || j < 0)
        return 0;
    if((k == 0) && (j != 0))
        return add_up(s, 0, j);
    if((k == 1) && (j != 0))
        return minimum(s, 0, j);
    if(k-1 == j)
        return add_up(s, 0, j);
    for(i=k; i>=0; i--) {
        int res=min((s[j]-'0')+10*foo(s, size, j-1, k-1), foo(s, size, j-1, k));  
        sum=min(sum,res); // minimum over all possible i
    }
    return sum;
}