90分求助!开了三维dp,但卡在第一个点
查看原帖
90分求助!开了三维dp,但卡在第一个点
397926
愚末语tenseTL楼主2021/7/28 18:58
#include<bits/stdc++.h>
using namespace std;
#define INF 1e10+7
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n, w;
	cin >> n >> w;
	vector<pair<int, int>>v(n + 1);
	int minn = INF;
	for (int i = 1; i <= n; i++) {
		int a, b;
		cin >> a >> b;
		v[i] = make_pair(a, b);
		minn = min(minn, a);
	}
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		v[i].first -= minn-1;
		cnt += v[i].first;
	}
	vector<vector<vector<int>>>dp(n + 1, vector<vector<int>>(cnt + 1, vector<int>(n + 1)));
	//vector<vector<int>>dp(cnt + 1, vector<int>(n + 1));
	for (int i = 1; i <= n; i++) {
		for (int j = cnt; j >= v[i].first; j--) {
			for (int k =i; k >= 1; k--) {
				dp[i][j][k] = dp[i - 1][j][k];
				if (k*(minn - 1) + j <= w){
					dp[i][j][k] = max(dp[i][j][k], dp[i-1][j - v[i].first][k - 1] + v[i].second);
					//dp[j][k] = max(dp[j][k], dp[j - v[i].first][k - 1] + v[i].second);
				}

			}
		}
	}
	int ans = 0;
		for (int i = 1; i <= cnt; i++) {
			for (int j = 1; j <= n; j++) {
				ans = max(ans, dp[n][i][j]);
			}
		}
	
	cout << ans << endl;
	return 0;
}
2021/7/28 18:58
加载中...