求助 开始以为附件会有很多个 为什么这样不行 将主从分开来求, dp1表示主 dp2表示从 选主后在考虑从
#include<bits/stdc++.h>
#include <iostream>
using namespace std;
const int maxn = 10001;
int zhujian_value[maxn];
int zhujian_impo[maxn];
vector<int> fujian_value[60];
vector<int> fujian_impo[60];
int value;
int N,coun=0;
int dp1[maxn];
int dp2[maxn][maxn];
using namespace std;
int main(){
cin >> value >> N;
int max_bian = 0;
for (int i = 0; i < N; ++i) {
int val, impo, bian;
cin >> val >> impo >> bian;
if (bian == 0) {
zhujian_value[coun] = val;
zhujian_impo[coun++] = impo;
}
else {
max_bian = max(max_bian, bian);
fujian_value[bian].push_back(val);
fujian_impo[bian].push_back(impo);
}
}
for (int i = 1; i <= max_bian; ++i) {
for (int j = 1; j <= fujian_value[i].size(); ++j) {
for (int k = value; k >= fujian_value[i][j-1]; --k) {
dp2[i][k] = max(dp2[i][k], dp2[i][k - fujian_value[i][j-1]] + fujian_value[i][j-1] * fujian_impo[i][j-1]);
}
}
}
for (int i = 1; i <= coun; ++i) {
for (int j = value; j >= zhujian_value[i-1]; --j) {
int ans = dp1[j];
for (int k = 0; k <= j - zhujian_value[i-1]; ++k) {
ans = max(ans, dp1[j - zhujian_value[i-1] - k]+zhujian_value[i-1]*zhujian_impo[i-1]+dp2[i][k]);
}
dp1[i] = ans;
}
}
cout << dp1[coun];
}