1 条题解
-
0
#include<bits/stdc++.h> using namespace std; // [1] n-物品的种类数;v-背包的总容积(最大可装体积) int n,v; struct stu{ // [2] m-第i种物品的单个体积;w-第i种物品的单个价值;s-第i种物品的最大数量 int m,w,s; }arr[1100]; // [3] arr数组-存储每种物品的体积、价值、数量 int dp[1100]={}; // [4] dp数组-动态规划状态,dp[k]表示容积为k的背包能装入的最大价值 int main(){ // 问题分析:多重背包问题,每种物品有体积、价值和数量限制,求容积V的背包能装的最大价值 // 解题步骤:朴素三重循环实现(数据范围小,可通过),将每个物品拆成s个独立物品做01背包 // 外层遍历物品,中间遍历物品数量,内层逆序遍历背包容量更新状态 cin>>n>>v; // [5] 读取物品种类数n和背包总容积v for(int i=1;i<=n;i++){ cin>>arr[i].m>>arr[i].w>>arr[i].s; // [6] 读取每种物品的体积、价值、数量 } dp[0]=0; // [7] 初始化:容积为0的背包价值为0 // 遍历每一种物品 for(int i=1;i<=n;i++){ // 遍历该物品的可使用数量(1~s),等价于拆成s个独立物品做01背包 for(int j=1;j<=arr[i].s;j++){ // 逆序遍历背包容量(01背包核心,避免重复选取同一物品) for(int k=v;k>=arr[i].m;k--){ // [8] 状态转移:不选当前物品则dp[k]不变;选则取dp[k-物品体积]+物品价值,取最大值 dp[k]=max(dp[k],dp[k-arr[i].m]+arr[i].w); } } } cout<<dp[v]; // [9] 输出容积为v的背包能装入的最大价值 return 0; }
- 1
信息
- ID
- 1339
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者