满减优惠[Offer收割]编程练习赛4


题目1 : 满减优惠
时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

最近天气炎热,小Ho天天宅在家里叫外卖。他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元。并且如果消费总计满X元,还能享受优惠。小Ho是一个不薅羊毛不舒服斯基的人,他希望选择若干道不同的菜品,使得总价在不低于X元的同时尽量低。

你能算出这一餐小Ho最少消费多少元吗?
输入

第一行包含两个整数N和X,(1 <= N <= 20, 1 <= X <= 100)

第二行包含N个整数A1, A2, ..., AN。(1 <= Ai <= 100)
输出

输出最少的消费。如果小Ho把N道菜都买了还不能达到X元的优惠标准,输出-1。
样例输入

    10 50
    9 9 9 9 9 9 9 9 9 8

样例输出

    53
 0元的时候肯定不许点菜就可满足。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
const int maxn = 200010;
typedef long long ll;
int dp[10500],s[500],sum;
int main()
{
    //freopen("data.in","r",stdin);
    int n,x;
    scanf("%d%d",&n,&x);
    for(int i=1;i<=n;i++){
        scanf("%d",s+i);
        sum+=s[i];
    }
    if(sum<x){printf("-1\n");}
    else{
        dp[0]=1;
        for(int i=1;i<=n;i++){
            for(int j=sum;j>=s[i];j--){
                dp[j]|=dp[j-s[i]];
            }
        }
        for(int i=x;i<=sum;i++)
        if(dp[i]){
            printf("%d\n",i);
            break;
        }
    }
}

 

posted on 2016-08-07 17:14  acmtime  阅读(532)  评论(0编辑  收藏  举报

导航