本蒟蒻已经从19:00爆肝到十分钟前了(之后一直在调试) 但是样例都没过 头痛欲裂
源代码 :
#include <iostream>
#include <algorithm>
using namespace std ;
#define int long long
#define INF 32005
int n , m ;
struct Node {
int ip ; // 第 几 行 输 入
int pri ; // 价 格
int imp ; // 重 要 度
int aff ; // 附 属 于 第 几 行 的 主 件
} comm[INF] ;
int ans ;
int dp [INF] ;
int dfs (int i ,int money ,int pro_sum) {
if (dp [i]) return dp [i] ;
if (i == m or money <= comm[i].pri){
if(pro_sum > ans) ans = pro_sum ;
return 0 ;
}
dp[i] = 1 ;
if(comm[i].aff == 0){
if (comm[i].pri <= money) {
dp[i] = max (dfs(i + 1 , money - comm[i].pri , pro_sum + comm[i].pri * comm[i].imp) , dfs (i + 1 , money , pro_sum)) ;
}
}else {
if (comm[i].pri + comm[comm[i].aff -1].pri <= money) {
dp[i] = max (dfs(i + 1 , money - (comm[i].pri + comm[comm[i].aff -1].pri) , pro_sum + comm[i].pri * comm[i].imp) , dfs (i + 1 , money , pro_sum)) ;
}
}
return dp [i] ;
}
bool cmp (Node x , Node y) {
if(y.aff == x.ip - 1) return true ;
else if (x.aff == y.aff and x.pri == y.pri) return x.imp > y.imp ;
else return x.pri > y.pri ;
}
signed main ( ) {
cin >> n >> m ;
for(int i = 0 ; i < m ; i ++) {
comm[i].ip = i + 1 ;
cin >> comm[i].pri >> comm[i].imp >> comm[i].aff ;
}
sort (comm , comm + m , cmp) ;
dfs (0 , n , 0) ;
cout << ans << endl ;
return 0 ;
}