0pts求调
查看原帖
0pts求调
759862
goodfish楼主2025/1/14 20:32

用的是贪心的思路

#include <bits/stdc++.h>
#define INF LONG_LONG_MAX
#define int long long
using namespace std;

int dp[2][5005], w[5005], v[5005];
signed main(){
	int n, x, s, m;
	cin >> n >> x >> s >> m;
	
	for (int i = 1; i <= x; i ++){
		dp[0][i] = INF;
	}
	
	for (int i = 1; i <= n; i ++){
		int u, sumw = 0;
		cin >> u;
		
		for (int j = 1; j <= u; j ++){
			cin >> v[j];
		}for (int j = 1; j <= u; j ++){
			cin >> w[j];
			sumw += w[j];
		}for (int j = m + 1; j <= s; j ++){
			dp[1][j] = INF;
		}
		
		sumw = min(sumw + m, s);
		
		for (int j = 1; j <= u; j ++){
			for (int k = sumw; k >= w[j]; k --){
				dp[1][k] = min(dp[1][k], dp[1][k - w[j]] + v[j]);
			}
		}for (int j = x; j >= 0; j --){
			for (int k = m; k <= sumw; k ++){
				dp[0][j] = min(dp[0][j], dp[0][max(j - k, 0ll)] + dp[1][k]);
			}
		}
	}
	
	cout << (dp[0][x] == INF ? -1 : dp[0][x]);
}

dalao求调

2025/1/14 20:32
加载中...