标签:uva
CD |
You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music is on CDs. You need to have it on tapes so the problem to solve is: you have a tape N minutes long. How to choose tracks from CD to get most out of tape space and have as short unused space as possible.
Assumptions:
Program should find the set of tracks which fills the tape best and print it in the same sequence as the tracks are stored on the CD
5 3 1 3 4 10 4 9 8 4 2 20 4 10 5 7 4 90 8 10 23 1 2 3 4 5 7 45 8 4 10 44 43 12 9 8 2
1 4 sum:5 8 2 sum:10 10 5 4 sum:19 10 23 1 2 3 4 5 7 sum:55 4 10 12 9 8 2 sum:45
直接枚举所有状态
#include <stdio.h> #include <string.h> using namespace std; const int inf=1<<30; #define max(a,b) (a>b?a:b) #define ll long long ll sum,n,a[25],tem,maxn,flag; int main() { ll i,j; while(~scanf("%lld%lld",&sum,&n)) { maxn = -inf; for(i=1; i<=n; i++) scanf("%lld",&a[i]); tem = 1<<n; for(i = 1; i<tem; i++) { ll t=i,k=1,s=0; while(t) { ll r = t%2; t/=2; if(r) { s+=a[k]; } k++; } if(s<=sum && s>=maxn) { maxn = max(maxn,s); flag = i; } } ll k = 1; while(flag) { ll r = flag%2; flag/=2; if(r) { printf("%lld ",a[k]); } k++; } printf("sum:%lld\n",maxn); } return 0; }
标签:uva
原文地址:http://blog.csdn.net/libin56842/article/details/41523287