考虑附件有很多的情况,但是连样例都过不去,请大佬教教
查看原帖
考虑附件有很多的情况,但是连样例都过不去,请大佬教教
1078604
IQAQI楼主2024/4/13 23:25

求助 开始以为附件会有很多个 为什么这样不行 将主从分开来求, 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];
   
}
2024/4/13 23:25
加载中...