MT46. 外卖满减
描述
输入描述
第一行两个正整数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; }