设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 ;
}

最新文章

  1. 孙鑫MFC学习笔记8:对话框编程(下)
  2. ajax 删除一条数据
  3. Oracle 课程八之性能优化之Oracle SQL Trace
  4. 标准I/O库之格式化I/O
  5. linux 流量监控 ---iptraf的安装及使用
  6. 用JavaScript 来将数字转换成字符。
  7. 怎样编制excel序列目录
  8. Java栈与堆 (转)
  9. Spring Boot jar包linux服务器部署
  10. UVA - 11235:Frequent values
  11. linux下磁盘分区详解 图文(fdisk;mkfs)
  12. Python 安装 (win10)
  13. 第四章:4.0 python常用的模块
  14. 后台封装的easyui框架,处理texbox的时候报错:未结束的字符串常量。
  15. Charles 学习笔记
  16. 背水一战 Windows 10 (106) - 通知(Toast): 通过 toast 打开协议, 通过 toast 选择在指定的时间之后延迟提醒或者取消延迟提醒
  17. [译]Use Dependency Injection In WebForms Application
  18. 浅拷贝和深拷贝(谈谈java中的clone)
  19. Java 读取 txt 文件内容到容器 List
  20. python之路——7

热门文章

  1. linux之文件查找find grep详解,以及压缩归档
  2. 461. 汉明距离(Hamming Distance)leetcode
  3. 【Linux开发】linux设备驱动归纳总结(四):3.抢占和上下文切换
  4. 论文阅读 | Towards a Robust Deep Neural Network in Text Domain A Survey
  5. Eclipse注释
  6. hdfs基本文件操作
  7. java生成0~9个9个不相等的整数
  8. 尝试自己搭一个简单的typescript运行环境
  9. Vue的快速入门
  10. 从入门到自闭之Python函数初识