題目描述
新學期伊始,適逢頓頓書城有購書滿 x 元包郵的活動,小 P 同學欣然前往準備買些參考書。
一番瀏覽后,小 P 初步篩選出 n 本書加入購物車中,其中第 i 本(1≤i≤n)的價格為 ai 元。
考慮到預算有限,在最終付款前小 P 決定再從購物車中刪去幾本書(也可以不刪),使得剩余圖書的價格總和 m 在滿足包郵條件(m≥x)的前提下最小。
試幫助小 P 計算,最終選購哪些書可以在湊夠 x 元包郵的前提下花費最小?
輸入格式
從標準輸入讀入數據。
輸入的第一行包含空格分隔的兩個正整數 n 和 x,分別表示購物車中圖書數量和包郵條件。
接下來輸入 n 行,其中第 i 行(1≤i≤n)僅包含一個正整數 ai,表示購物車中第 i 本書的價格。輸入數據保證 n 本書的價格總和不小于 x。
輸出格式
輸出到標準輸出。
僅輸出一個正整數,表示在滿足包郵條件下的最小花費。
樣例1輸入
4 100
20
90
60
60
樣例1輸出
110
樣例1解釋
購買前兩本書(20+90)即可包郵且花費最小。
樣例2輸入
3 30
15
40
30
樣例2輸出
30
樣例2解釋
僅購買第三本書恰好可以滿足包郵條件。
樣例3輸入
2 90
50
50
樣例3輸出
100
樣例3解釋
必須全部購買才能包郵。
子任務
70% 的測試數據滿足:n≤15;
全部的測試數據滿足:n≤30,每本書的價格 ai≤104 且 x≤a1+a2+?+an。
提示
對于 70% 的測試數據,直接枚舉所有可能的情況即可。
直接枚舉所有情況來求解(70%),注意枚舉的方法:利用&進行位的與運算,i&(1<<j)來表示第 i?位是否為 1。
#include <bits/stdc++.h>
using namespace std;
int main() {int n,m;cin>>n>>m;int arr[n];int sum=0;for (int i = 0; i < n; i++) {cin>>arr[i];sum+=arr[i];}long long l=pow(2,n);for (int i = 0; i < l; i++) {int k=0;for (int j = 0; j < n; j++) {if (i&(1<<j)) {k+=arr[j];}}if ((k>=m)&&(k<sum)) {sum=k;}}cout<<sum;
}
python版:
n,m=map(int,input().split())
# arr=list(map(int,input().split()))
arr = [int(input()) for x in range(n)]
su=sum(arr)
for i in range(2**n):k=0;for j in range(n):if(i&(1<<j)):k+=arr[j]if(k>=m)and(k<su):su=k
print(su)