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;
    }
  • 相关阅读:
    fastx_toolkit软件使用说明
    转:bwa的使用方法
    转: Annovar 软件注释流程介绍
    转:linux下bwa和samtools的安装与使用
    GFF3格式
    漂浮广告窗
    CPU指令集设计RISC和CISC
    南方
    成都 夹三品
    微嵌1
  • 原文地址:https://www.cnblogs.com/doubest/p/12286470.html
Copyright © 2011-2022 走看看