zoukankan      html  css  js  c++  java
  • 01背包问题

    题目链接:

    https://www.acwing.com/problem/content/2/

    题解:

    关于DP问题,我们一般可以用一套模式去分析

    1、分析状态表示f(i,j):

    1)f(i,j)表示哪个集合?在01背包问题中,它表示选法的一个集合

    2)i,j表示什么条件?在01背包问题中,它表示前i个物品,总体积小于等于j

    3)f(i,j)的属性含义是什么?一般有max,min,数量。在01背包问题,它表示最大价值,是max类型

    2、分析状态计算

    本质上就是对当前集合f(i,j)进行一个划分:

    要求是不重不漏,在这里,我们可以将其划分为包含i的集合和不包含i的集合。

    包含i的集合表示为:f(i,j) = f(i-1,j);

    不包含i的集合表示为:f(i,j) = f(i-1,j-v[i])+w[i];

    AC代码:

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 1010;
    int n,m;
    int v[N],w[N];
    int f[N][N];
    
    
    int main(){
        cin >> n >> m;
        for(int i=1;i<=n;i++) cin >> v[i] >> w[i];
        
        for(int i=1;i<=n;i++){
            for(int j=0;j<=m;j++){
                f[i][j] = f[i-1][j];
                if(j >= v[i]){
                    f[i][j] = max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
                }
            }
        }
        
        cout << f[n][m] << endl;
        
        return 0;
    }
  • 相关阅读:
    Windows 8.1 序列化与反序列化
    window store app 附件读取
    Window 8.1 计时器功能及图片切换
    c#多层嵌套Json
    isNotNull与isNotEmpty的区别
    商务用语
    国家气象局三天天气WebService接口
    WebServise
    EF架构基础代码
    接口定义
  • 原文地址:https://www.cnblogs.com/doubest/p/12286470.html
Copyright © 2011-2022 走看看