I - Coins dp
2024-10-09 01:27:06
http://acm.hdu.edu.cn/showproblem.php?pid=2844
这个题目是一个多重背包转化成01背包
题意: Whuacmers拥有bi个面值为ai的硬币,现在他要用这些硬币买价格不超过m的一个物品,问你最多能刚好能用硬币付钱的物品价格有几个(即该价格能用这些硬币凑出来)。
思路: 看到多重背包问题,第一时间想到的是转化为01背包来做,即我们把这个物品能选取多次当成有多个相同的物品给我们选取,复杂度是o(m*(bi的和)),根据题目给出的数据范围,这个方法的复杂度是妥妥的TLE的,我们需要对这个方法进行优化,我们可以用二进制的思想来考虑.
将第i种物品分成若干件01背包中的物品,其中每件物品有一个系数。这件物品的费用和价值均是原来的费用和价值乘以这个系数。令这些系数 分别为1,2,22…2k−1,bi−2k+1,且k是满足bi−2k+1 > 0的最大整数。例 如,如果bi为13,则相应的k = 3,这种最多取13件的物品应被分成系数分别 为1,2,4,6的四件物品。 分成的这几件物品的系数和为bi,表明不可能取多于bi件的第i种物品。另 外这种方法也能保证对于0…bi间的每一个整数,均可以用若干个系数的和表示。
下面是一个模板,我觉得写的特别好
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#define inf64 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e6 + ;
int num[maxn], dp[maxn], val[maxn];
int N,V; void zero(int weight,int value)
{
for(int i=V;i>=weight;i--)
{
dp[i] = max(dp[i], dp[i - weight] + value);
}
} void all(int weight,int value)
{
for(int i=weight;i<=V;i++)
{
dp[i] = max(dp[i], dp[i - weight] + value);
}
} void solve()
{
int t = ;
int ncount = ;
for(int i=;i<=N;i++)
{
if (num[i] * val[i] >= V) all(val[i], val[i]);
else
{
t = ;
ncount = num[i];
while(t<=ncount)
{
zero(t*val[i], t*val[i]);
ncount -= t;
t *= ;
}
zero(ncount*val[i], ncount*val[i]);
}
}
} int main()
{
while(cin>>N>>V&&N!=&&V!=)
{
for (int i = ; i <= N; i++) scanf("%d", &val[i]);
for (int i = ; i <= N; i++) scanf("%d", &num[i]);
memset(dp, -inf, sizeof(dp));
dp[] = ;
solve();
int ans = ;
for(int i=;i<=V;i++)
{
if (dp[i] > ) ans++;
//printf("dp[%d]=%d\n",i, dp[i]);
}
printf("%d\n", ans);
}
return ;
}
最新文章
- Windows Phone Sliding Effect
- About_datebase
- PHP判断访问终端,电脑或手机访问
- Tomcat与内存泄露
- Android开发面试经——2.常见Android基础笔试题
- Android隐藏虚拟按键,关闭开机动画、开机声音
- 【C#学习笔记】数组使用
- 【周期串】NYOJ-1121 周期串
- 2 hive的使用 + hive的常用语法
- angular2 学习笔记 ( ngModule 模块 )
- volatile的理解和使用
- Angular4---起步----环境配置安装@angular/cli
- PHP MySQL 简介
- PE知识复习之PE的重定位表
- TreeMap 的排序冲突吗
- kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries. 最无语的配置
- .NET MVC 过滤器使用
- 力奋github:https://github.com/birdstudiocn
- underscore.js源码研究(8)
- [Asp.net mvc]Asp.net mvc 中使用LocalStorage
热门文章
- SpringMVC框架详细教程(四)_使用maven导入各个版本的Spring依赖包
- mysql添加,授权,删除用户以及连接数据库Can&#39;t connect to MySQL server on &#39;192.168.31.106&#39; (113)错误排查
- alg-最长公共子序列
- Odoo 查看 模块app 对应的 源码 相关依赖模块信息
- PrestoSPI安全扩展
- Vulnhub-dpwwn-01靶机过关记录
- 重磅!阿里发布《Java开发手册(泰山版)》
- 为什么要你们现在要学习python
- 讲讲python中函数的参数
- Shutdown SpringBoot App