HOJ 2159 FATE(完全背包)

这篇博客探讨了完全背包问题,将其转化为一个体积为m的背包装物品以求最大价值的数学模型。重点介绍了当物品总数受限于s时,如何使用二维数组mp[MaxN][MaxN]进行计数,并解释了状态转移方程f[i][j]的含义,即从前i个物品中选取总体积为j的物品所能达到的最大价值。最终目标是找到最小消耗体积下使价值达到n的方案,即寻找满足f[i][j]>=n时的最大剩余体积m-j。
摘要由CSDN通过智能技术生成

完全背包
k 个怪物, 每打一个怪物有经验, 消耗忍耐度。 可以把 经验看做是 价值 w[i], 忍耐度看做是体积 v[i].
题目转化为, 用一个体积为 m 的背包,装一些物品(每一个物品可以装无限次), 取得的最大价值。
裸的完全背包题目。
本题要点:
1、n <= 100, 可开二维数组。 但是,这里有个限制,取的物品总数不能超过 s 个。所用,需要一个数组 mp[MaxN][MaxN]
来计数, 以保证取物品,不超过 s 个。
2、f[i][j] 表示 从前i个物品中,选出总体积是j的物品,最大价值
mp[i][j] 表示计算 f[i][j] 时候,一共选择了多少物品
3、 最后要求输出的是,在消耗最少的体积的情况下,能够获得 n 的价值。 答案就是,算出来的每一个 f[i][j],
找出一个 f[i][j] >= n 时候, m - j 的最大值(剩余体积,就是剩余忍耐度)

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int MaxN = 110, INF = 0xcfcfcfcf;
int n, m, k, s;
int w[MaxN], v[MaxN];	// 价值,体积
int f[MaxN][MaxN];		// f[i][j] 表示 从前i个物品中,选出总体积是j的物品,最大价值
int mp[MaxN][MaxN];		// mp[i][j] 表示计算 f[i][j] 时候,一共选择了多少物品

void solve
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值