题目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
DP背包问题。就是理解成装X价值的东西至少需要多大的包。
#include<bits/stdc++.h>
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
int main(){
int n,x,sum=0;
int a[25];
int dp[2050];
cin>>n>>x;
memset(dp,0,sizeof(dp));
for(int i = 1 ; i <= n ; i++){
cin>>a[i];
sum += a[i];
}
if(sum < x) cout<<"-1"<<endl;
else if(sum == x) cout<<n<<endl;
else {
for(int i = 1 ; i <= n ; i++){
int v = a[i];
for(int j = sum ; j >= v ; j--){
dp[j] = max(dp[j],dp[j-v]+v);
}
}
for(int i = 1 ; i <= sum ; i++){
if(dp[i] >= x){
cout<<i<<endl;
break;
}
}
}
return 0;
}