hihoCoder

来源:互联网 发布:java模拟登陆获取数据 编辑:程序博客网 时间:2024/05/20 02:24


时间限制: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 509 9 9 9 9 9 9 9 9 8
样例输出
53

直接写DFS搜索会超时,这里用二进制枚举,本质也是暴力枚举子集,但位运算速度很快可以AC

#include <bits/stdc++.h>  #define INF 0x3f3f3f3f  using namespace std;    const int N = 25;  int a[N];    int main(){      int n, x;      while( ~scanf( "%d%d", &n, &x ) ){          int sum = 0;          for( int i = 0; i < n; ++i ) {              scanf( "%d", &a[i] );              sum += a[i];          }          if( sum < x ) {              puts( "-1" );              return 0;          }          int ans = INF;          for( int i = 1; i < ( 1 << n ); ++i ) {              int tmp = 0;              for( int j = 0; j < n; ++j ) {                  if( ( i >> j ) & 1 ) {                      tmp += a[j];                  }              }              if( tmp >= x )                  ans = min( ans, tmp );          }          printf( "%d\n", ans );      }          return 0;  }  


0 0
原创粉丝点击