hdu2159 二维02bag
2024-08-31 11:11:56
设f[i][j]为杀第j只怪时耐久度为i的最大经验值
完全背包类型:有N种物品和一个容量为V 的背包,每种物品都有无限件可用。放入第i种物品的耗费的空间是Ci,得到的价值是Wi。
求解:将哪些物品装入背包,可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
const int maxn=; int a[maxn],b[maxn];
int f[maxn][maxn];//f[i][j]表示杀第j只怪时耐久度为i的最大经验值 int main()
{
int n,m,k,s,i,j,z; while (scanf("%d%d%d%d",&n,&m,&k,&s)==)
{
memset(f,,sizeof (f)); for (i=;i<=k;i++)
scanf("%d%d",&a[i],&b[i]);
for (i=;i<=k;i++)//从第1个怪到第k个怪
{
for (j=;j<=m;j++)//耐久度从1到m,耐久度为0时经验必为0
{
int temp=j/b[i];//对于第i种怪以耐久度限制最多杀temp只
for (z=;z<=min(s,temp);z++)//杀1-min(temp,s)只怪,杀0只怪经验必为0
{
f[j][z]=max(f[j][z],f[j-][z]);//不能添加f[j][z]=max(f[j][z-1],f[j][z]),因为z是杀怪数量
f[j][z]=max(f[j-b[i]][z-]+a[i],f[j][z]);//值为如果杀了这只怪和不杀这只怪的最大经验值
}
}
} int ans=999999;
for (i=;i<=m&&ans==999999;i++)
{
for (j=;j<=s;j++)
{
if (f[i][j]>=n)
{
ans=i;
break;
}
}
} if (ans==999999)
cout<<-<<endl;
else
cout<<m-ans<<endl; } return ;
}
最新文章
- 孙鑫MFC学习笔记8:对话框编程(下)
- ajax 删除一条数据
- Oracle 课程八之性能优化之Oracle SQL Trace
- 标准I/O库之格式化I/O
- linux 流量监控 ---iptraf的安装及使用
- 用JavaScript 来将数字转换成字符。
- 怎样编制excel序列目录
- Java栈与堆 (转)
- Spring Boot jar包linux服务器部署
- UVA - 11235:Frequent values
- linux下磁盘分区详解 图文(fdisk;mkfs)
- Python 安装 (win10)
- 第四章:4.0 python常用的模块
- 后台封装的easyui框架,处理texbox的时候报错:未结束的字符串常量。
- Charles 学习笔记
- 背水一战 Windows 10 (106) - 通知(Toast): 通过 toast 打开协议, 通过 toast 选择在指定的时间之后延迟提醒或者取消延迟提醒
- [译]Use Dependency Injection In WebForms Application
- 浅拷贝和深拷贝(谈谈java中的clone)
- Java 读取 txt 文件内容到容器 List
- python之路——7