• 完全背包问题。


    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式子简单所以错的话要改就很玄学。

  • 相关阅读:
    c# 线程同步各类锁
    C#_从DataTable中检索信息
    永无BUG
    标志枚举
    将多行按分隔符"|"合成一行
    回车换行浅析
    url传输编码
    xshell 禁用铃声 提示音
    php 编译安装 mysql.so
    301 302 304
  • 原文地址:https://www.cnblogs.com/beiyueya/p/12145520.html
Copyright © 2020-2023  润新知