zoukankan      html  css  js  c++  java
  • 完全背包问题。

    1,就是在01背包的基础上,每个物品你都可以选k次。(k取决于你的负重)

    2,令dp[i+1][j]=从前i种物品种挑选总重量不超过j时总价值的最大值。

    则递推关系为:

    dp[0][j]=0;

    dp[i+1][j]=max{dp[i][j-k*w[i]]+k*v[i]|k>=0}

    3,其实dp的式子倒不是怎么难,关键是怎么想出这个式子。

    #include<iostream>
    using namespace std;
    int n,wei,w[1005],v[1005];
    int dp[1005][1005];
    int main(){
        cin>>n;
        for(int i=0;i<n;i++){cin>>w[i];cin>>v[i];
        }
        cin>>wei;
        for(int i=0;i<n;i++){
            for(int j=0;j<=wei;j++){
                for(int k=0;k*w[i]<=j;k++){
                    dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*w[i]]+k*v[i]);
                }
            }
        } 
        cout<<dp[n][wei]<<endl;
    }

    要不要手推模拟一下样例。

    可以得出一个都有一个要么选了,要么没选的问题。

    费大 和费小,

    背包问题就是捡钻石问题。

    改的话用之前那个反向的,没弄对。

    dp式子简单所以错的话要改就很玄学。

  • 相关阅读:
    PHP04
    PHP03
    PHP02
    PHP01
    jquery attr()方法获取input的checked属性问题
    vue案例
    js基础(数组)
    js基础
    POJ1659 可图性判定
    ZOJ3329 概率DP
  • 原文地址:https://www.cnblogs.com/beiyueya/p/12145520.html
Copyright © 2011-2022 走看看