列表

详情


MT46. 外卖满减

描述

你打开了美了么外卖,选择了一家店,你手里有一张满 X 元减 10 元的券,店里总共有 n 种菜,第 i 种菜一份需要 Ai 元,因为你不想吃太多份同一种菜,所以每种菜你最多只能点一份,现在问你最少需要选择多少元的商品才能使用这张券。

数据范围: ,

输入描述

第一行两个正整数n和X,分别表示菜品数量和券的最低使用价格。 接下来一行n个整数,第i个整数表示第i种菜品的价格。

输出描述

一个数,表示最少需要选择多少元的菜才能使用这张满X元减10元的券,保证有解。

示例1

输入:

5 20
18 19 17 6 7

输出:

23

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-04-12

#include<stdio.h>
int max(int a,int b){
    if (a>b)
        return a;
    else
        return b;
}
int main()
{int n,x;
int maxn = 100010;
int dp[maxn],a[200];
    scanf("%d %d",&n,&x);
    for(int i = 0; i < n;i++)
        scanf("%d",&a[i]);
    for(int i = 0;i < n;i++)
    {
        for(int j = x + a[i];j >= a[i];j--)
        {
            dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
        }
    }
    for(int i = x;;i++)
    {
        if(dp[i] >= x) {
            printf("%d",i);
            break;
        }
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 496KB, 提交时间: 2020-05-20

#include<stdio.h>
int max(int a,int b){
    if (a>b)
        return a;
    else
        return b;
}
int main()
{int n,x;
int maxn = 100010;
int dp[maxn],a[200];
    scanf("%d %d",&n,&x);
    for(int i = 0; i < n;i++)
        scanf("%d",&a[i]);
    for(int i = 0;i < n;i++)
    {
        for(int j = x + a[i];j >= a[i];j--)
        {
            dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
        }
    }
    for(int i = x;;i++)
    {
        if(dp[i] >= x) {
            printf("%d",i);
            break;
        }
    }
    return 0;
}

上一题