博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu-2844&&POJ-1742 Coins---多重背包
阅读量:6224 次
发布时间:2019-06-21

本文共 1480 字,大约阅读时间需要 4 分钟。

题目链接:

题目大意:

Tony想要买一个东西,他只有n中硬币每种硬币的面值为a[i]每种硬币的数量为c[i]要买的物品价值不超过m

输入:第一行输入n和m,第二行输入n个硬币的面值和n个硬币的数量,输入0 0结束

输出:1到m之间有多少价格Tony可以支付

思路:

多重背包修改一下,如果dp[j-w[i]]可以到达,那么dp[j]也可到达

1 #include
2 #include
3 #include
4 using namespace std; 5 const int INF = 0x3f3f3f3f; 6 const int maxn = 200 + 10; 7 int T, n, m, cases; 8 int cost[maxn], amount[maxn]; 9 bool dp[100000 + 100];10 void zeroone(int cost)11 {12 for(int i = m; i >= cost; i--)13 if(dp[i - cost])dp[i] = dp[i - cost];14 }15 void complete(int cost)16 {17 for(int i = cost; i <= m; i++)18 if(dp[i - cost])dp[i] = dp[i - cost];19 }20 void solve(int cost, int amount)21 {22 if(cost * amount >= m)23 complete(cost);24 else25 {26 int k = 1;//二进制优化27 while(k <= amount)28 {29 zeroone(k * cost);30 amount -= k;31 k *= 2;32 }33 zeroone(amount * cost);34 }35 }36 int main()37 {38 while(cin >> n >> m && (n + m))39 {40 for(int i = 0; i < n; i++)cin >> cost[i];41 for(int i = 0; i < n; i++)cin >> amount[i];42 memset(dp, 0, sizeof(dp));43 dp[0] = 1;44 for(int i = 0; i < n; i++)45 {46 solve(cost[i], amount[i]);47 }48 int ans = 0;49 for(int i = 1; i <= m; i++)ans += dp[i];50 cout<
<

 

转载于:https://www.cnblogs.com/fzl194/p/8831864.html

你可能感兴趣的文章
labview加密分析-1综述
查看>>
log4j自定义Appender
查看>>
部署公司后台管理系统中 关于jar包冲突的问题
查看>>
【九度OJ1367】|【剑指offer24】二叉搜索树的后序遍历序列
查看>>
JVM运行时内存结构
查看>>
MySQL数据库删除后的恢复工作
查看>>
转:wordpress样式修改
查看>>
我的友情链接
查看>>
仿新浪微博底部菜单TabHost
查看>>
【高清视频】CCNA系列课程之五:STP生成树协议介绍
查看>>
u盘 找不到应用程序
查看>>
Red hat samba不识别windows 下的中文
查看>>
MDT U盘自动部署报错解决办法
查看>>
java线程
查看>>
函数式编程----内建函数
查看>>
PHP的数据库显示中文乱码有几种情况?
查看>>
fedora25配置 Infinality 字体渲染增强
查看>>
linux修改主机名
查看>>
squid 如何清除缓存
查看>>
Discuz!云平台能给站长带来什么?
查看>>