1 条题解

  • 0
    @ 2024-9-6 13:51:08

    这道题是完全背包问题的模板题

    nn 是物品种数,mm 是背包容量。viv_i 是第 ii 种物品的体积,wiw_i 是第 ii 种物品的价值。我们枚举 nn 种物品,第 ii 种物品枚举它的体积,直到背包装不下,但是不可以从 11 开始,因为第 ii 件物品最小的体积就是 viv_i

    对于每个物品,我们可以选择取或者不取,状态 fjf_j 表示背包容量为 jj 可以装下的最大价值

    1、不取 => fj=fjf_j = f_j,状态不变

    2、取 => fj=fjvi+wif_j = f_{j-v_i}+w_i

    zj 认为讲的不好,附上视频链接:AcWing 3. 完全背包问题(闫氏DP分析法) - AcWing

    #include <bits/stdc++.h>
    int v[1010], w[1010];
    int f[1010];
    int main()
    {
    	int n, m;
    	std::cin >> n >> m;
    	for (int i = 1; i <= n; i ++) {
    		std::cin >> v[i] >> w[i];
    	}
    	for (int i = 1; i <= n; i ++) {
    		for (int j = v[i]; j <= m; j ++) {
    			f[j] = std::max(f[j], f[j - v[i]] + w[i]);
    		}
    	}
    	std::cout << f[m] << std::endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    98
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    20
    已通过
    15
    上传者