Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<cstdlib>
- using namespace std;
- #define ms(x,val) memset(x,val,sizeof(x))
- #define ull unsigned long long
- #define iii long long
- iii dp[25],dir[25],N,n_track,track[25],par[25];
- iii cal_track(iii i,iii cost)
- {
- if(dp[i]!=-1) return dp[i];
- if(i>=n_track) return 0;
- iii mx=0,temp=0;
- for(int j=i+1;j<n_track;j++)
- {
- if(cost+track[j]<=N)
- {
- temp=track[j]+cal_track(j,cost+track[j]);
- }
- if(mx<temp)
- {
- mx=temp;
- dir[i]=j;
- }
- }
- return dp[i]=mx;
- }
- int main()
- {
- bool flag=false;
- int start,MX,temp;
- while(scanf("%lld",&N)!=EOF)
- {
- if(flag) cout<<endl;
- flag=true;
- cin>>n_track;
- ms(dir,-1);
- for(int i=0;i<n_track;i++) cin>>track[i];
- MX=-1;
- start=-1;
- for(int i=0;i<n_track;i++)
- {
- ms(dp,-1);
- iii s=cal_track(i,track[i])+track[i];
- if(track[i]<=N && s>MX)
- {
- start=i;
- MX=s;
- }
- }
- ms(dp,-1);
- ms(dir,-1);
- cal_track(start,track[start]);
- while(start!=-1)
- {
- cout<<track[start]<<' ';
- start=dir[start];
- }
- cout<<"sum:"<<MX;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement