Group backpack principle

Group backpack

Similar to multiple backpacks, just select how many items for each item to choose which one for each group of items

状态转移方程 f [ i ] [ j ] = M a x ( f [ i − 1 ] [ j ] , f [ i − 1 ] [ j − v [ i ] [ k ] ] + w [ i ] [ k ] ) f[i][j] = Max(f[i-1][j],f[i-1][j-v[i][k]] + w[i][k]) f[i][j]=Max(f[i1][j],f[i1][jv [ i ] [ k ] ]+w[i][k])

So when optimizing to one dimension, you need to enumerate jj from large to smallj

int n, m;
int f[N];
int v[N][N], w[N][N], s[N];
int main() {
    
    
	cin >> n >> m;
	for (int i = 1;i <= n;++i) {
    
    
		cin >> s[i];
		for (int j = 0;j < s[i];++j) {
    
    
			cin >> v[i][j] >> w[i][j];
		}
	}

	for (int i = 1;i <= n;++i) {
    
    
		for (int j = m;j >= 0;--j) {
    
    
			for (int k = 0;k < s[i];++k) {
    
    
				if (v[i][k] <= j)f[j] = max(f[j], f[j - v[i][k]] + w[i][k]);
			}
		}
	}

Guess you like

Origin blog.csdn.net/zzq0523/article/details/113099674