UVa624 CD
题目大意
§
有不超过
20
个
CD
的音轨,转录到录音时长为
N
的磁带上
§
问容纳下最长时间的音轨组合
思路
¡
数量不大,才
20
,
2^20 = 1M
¡
枚举所有的子集,计算子集的元素和
¡
记录下不超过
N
的最大和及对应子集
代码
#include <functional>
#include <algorithm>
#include <stdexcept>
#include <iostream>
#include <sstream>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <utility>
#include <cctype>
#include <vector>
#include <string>
#include <bitset>
#include <cmath>
#include <queue>
#include <stack>
#include <ctime>
#include <list>
#include <map>
#include <set>
#include <cstdio>
#include <deque>
using namespace std;
#define PB push_back
#define MP make_pair
#define FU(i,n) for(i=0;i<n;i++)
#define FD(i,n) for(i=n-1;i>=0;i--)
typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef pair<int,int> PII;
typedef long long LL;
typedef unsigned long long ULL;
int main(){
int i,j,n,m,t[20],sum,max,st;
while(cin>>n){
cin >> m;
FU(i,m) cin >> t[i];
max = 0;
for(i=1;i<(1<<m);i++){
for(sum=0,j=0;j<m;j++) if(i&(1<<j)){
sum += t[j];
if(sum > n) break;
}
if(sum <= n && max < sum) max = sum,st = i;
}
for(j=0;j<m;j++) if(st&(1<<j)){
cout << t[j] << ' ';
}
cout << "sum:"<< max << endl;
}
return 0;
}