作业介绍

01 背包问题

dp[i][j] 表示前i件物品背包容量为j的情况下的最大价格

c[i] 表示第i件物品的价格

v[i] 表示第i件物品的体积

如果 v[i] <= j (第i件物品的体积<=背包容量)
  dp[i][j] = max(不拿第i件物品的最大价格,拿第i件物品的最大价格);
  dp[i][j] = max(dp[i-1][j],dp[i-1][j-v[i]]+c[i]);
否则 (第i件物品的体积>背包容量)
  dp[i][j] = 不拿第i件物品的最大价格;
  dp[i][j] = dp[i-1][j];

01背包代码模板

#include<bits/stdc++.h>
using namespace std;
int dp[25][105],n,w;
int v[25],c[25];
int main(){
    cin>>n>>w;
    for(int i=1;i<=n;i++) cin>>c[i];
    for(int i=1;i<=n;i++) cin>>v[i];
    for(int i=1;i<=n;i++){
        for(int j=1;j<=w;j++){
            if(j>=v[i]) dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+c[i]);
            else dp[i][j]=dp[i-1][j];
        }
    }
    cout<<dp[n][w];
    return 0;
}

01背包代码模板(滚动数组)

#include<bits/stdc++.h>
using namespace std;
int dp[105],n,w;
int v[25],c[25];
int main(){
    cin>>n>>w;
    for(int i=1;i<=n;i++) cin>>c[i];
    for(int i=1;i<=n;i++) cin>>v[i];
    for(int i=1;i<=n;i++){
        for(int j=w;j>=v[i];j--){
            dp[j]=max(dp[j],dp[j-v[i]]+c[i]);
        }
    }
    cout << dp[w];
    return 0;
}

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
8
开始时间
2024-10-1 0:00
截止时间
2024-11-30 23:59
可延期
24 小时