题目链接:点击打开链接
思路是dp加记录路径,也就交了20发才过。
比赛结束上源码。
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define INF 0x3f3f3f3f typedef struct { int ret; int value; int pos[1010]; int cnt; int st_sum; } node; node f[1010]; int main(int argc, char const *argv[]){ int T; cin >> T; int _case = 1; while ( T-- ){ int V; int n; cin>>V; cin>>n; int score[1010]; int weight[1010]; for (int i = 1; i <= n; ++i){ cin >> score[i] >> weight[i]; } printf("Case #%d:\n", _case); _case++; memset(f, 0, sizeof(f)); f[0].ret = 1; for (int i = 1; i <= n; ++i){ for (int j = V; j >= weight[i]; --j){ if ( f[j - weight[i]].ret == 1 ){ if ( f[j].value > f[j-weight[i]].value + score[i]){ continue; } else if ( f[j].value == f[j-weight[i]].value + score[i]){ if ( f[j].st_sum > f[j-weight[i]].st_sum + i ){ f[j] = f[j-weight[i]]; f[j].value = f[j-weight[i]].value + score[i]; f[j].pos[f[j].cnt] = i; f[j].cnt++; f[j].st_sum += i; sort(f[j].pos, f[j].pos + f[j].cnt); } else if ( f[j].st_sum == f[j-weight[i]].st_sum + i){ string a; string b; for(int k = 0; k < f[j].cnt; k++ ){ a += (f[j].pos[k] + '0'); } for(int k = 0; k < f[j-weight[i]].cnt; k++ ){ b += (f[j-weight[i]].pos[k] + '0'); } if( a.compare(b) == 1 ){ f[j] = f[j-weight[i]]; f[j].value = f[j-weight[i]].value + score[i]; f[j].pos[f[j].cnt] = i; f[j].cnt++; f[j].st_sum += i; sort(f[j].pos, f[j].pos + f[j].cnt); } } } else{ f[j] = f[j-weight[i]]; f[j].value = f[j-weight[i]].value + score[i]; f[j].pos[f[j].cnt] = i; f[j].cnt++; f[j].st_sum += i; sort(f[j].pos, f[j].pos + f[j].cnt); } } } } int ans = 0; int mmax = 0; for (int i = V; i >= 0 ; --i){ if ( f[i].value > mmax ){ ans = i; mmax = f[i].value; } else{ if( f[i].value == mmax ){ if ( f[i].st_sum < f[ans].st_sum ){ ans = i; } else if ( f[i].st_sum == f[ans].st_sum ){ string a; string b; for(int k = 0; k < f[i].cnt; k++ ){ a += (f[i].pos[k] + '0'); } for(int k = 0; k < f[ans].cnt; k++ ){ b += (f[ans].pos[k] + '0'); } if( a.compare(b) == -1 ){ ans = i; } } } } } cout<<f[ans].value<<' '; cout<<ans<<endl; for(int it = 0; it < f[ans].cnt; it++ ){ if( it != 0 ) { cout<<' '; } cout<<f[ans].pos[it]; } if( f[ans].value != 0){ cout<<'\n'; } } return 0; }