281. 硬币

2024-05-11 00:58
文章标签 硬币 281

本文主要是介绍281. 硬币,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:硬币

*算法分析:
初看起来就是个简单的多重背包, C i C_i Ci不大于1000,二进制拆分最多拆出10个数,这样时间复杂度在 1 0 8 10^8 108,勉强。提交后,数据强,超时。以下是标准二进制拆分超时代码。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n, m, A[110], a[1010], f[100010];
int main()  // 二进制拆分,超时  
{while (1){scanf("%d%d", &n, &m);if (!n && !m) break;for (int i = 1; i <= n; ++i) scanf("%d", &A[i]);int s = 0;for (int i = 1; i <= n; ++i){int c; scanf("%d", &c);int t = 1;while (c >= t){a[++s] = t * A[i];c -= t; t *= 2;}if (c > 0) a[++s] = c * A[i];}memset(f, 0, sizeof(f));f[0] = 1;for (int i = 1; i <= s; ++i)for (int j = m; j >= a[i]; --j)f[j] = f[j] || f[j-a[i]];int ans = 0;for (int j = 1; j <= m; ++j) ans += f[j];printf("%d\n", ans);}return 0;
}

据说用单调队列优化多重背包,可以达到 O ( n ∗ m ) O(n*m) O(nm)。以后有时间再补充。下面算法参考进阶指南。想法很巧妙。

u s e d [ j ] used[j] used[j]表示在 f [ j ] f[j] f[j]阶段为i时,体积为j,此时为true的情况下至少需要多少枚第i种硬币。采用一种贪心策略:让 u s e d [ j ] used[j] used[j]转移时,尽量不选第i种硬币。

也就是,当 f [ j − a [ i ] ] f[j-a[i]] f[ja[i]]为true时,如果此时 f [ j ] f[j] f[j]已经为true,则不执行dp转移。否则才让 f [ j ] = f [ j ] − a [ i ] f[j]=f[j]-a[i] f[j]=f[j]a[i],并且 u s e d [ j ] = u s e d [ j − a [ i ] ] + 1 used[j]=used[j-a[i]] + 1 used[j]=used[ja[i]]+1

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n, m, A[110], C[110], f[100010], used[100010];
int main()  
{while (1){scanf("%d%d", &n, &m);if (!n && !m) break;for (int i = 1; i <= n; ++i) scanf("%d", &A[i]);for (int i = 1; i <= n; ++i) scanf("%d", &C[i]);memset(f, 0, sizeof(f));f[0] = 1;for (int i = 1; i <= n; ++i){for (int j = 0; j <= m; ++j) used[j] = 0;for (int j = A[i]; j <= m; ++j)if (!f[j] && f[j-A[i]] && used[j-A[i]] < C[i]){f[j] = 1;used[j] = used[j-A[i]] + 1;}}int ans = 0;for (int j = 1; j <= m; ++j) ans += f[j];printf("%d\n", ans);}return 0;
}

这篇关于281. 硬币的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978054

相关文章

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

Codeforces Round #281 (Div. 2)A(构造+暴力模拟)

题目链接:http://codeforces.com/problemset/problem/493/A 解题思路: 暴力的判断,分三种情况去判断即可。注意如果之前已经被罚下场后,那么在后面的罚下情况不应该算在输出结果内。 完整代码: #include <algorithm>#include <iostream>#include <cstring>#include <co

完全背包问题-leetcode-08.11. 硬币

问题描述https://leetcode-cn.com/problems/coin-lcci/ 面试题 08.11. 硬币 硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 等价 背包。给定数量物品,物品体积为25、10、5和1,编写代码背包体积为n,装物品的方法有多少种。(结果可能会很大,你

硬币兑换

小P的故事——神奇的换零钱 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 已知A国经济很落后,他们只有1、2、3元三种面值的硬币,有一天小P要去A国旅行,想换一些零钱,小P很想知道将钱N兑换成硬币有很多种兑法,但是可惜的是他的数学竟然是体育老师教的,所以他不会啊、、、他只好求助于你,你可以帮他解决吗?

【hihocoder #1506 : 投掷硬币】递推

【链接】:hihocoder #1506 : 投掷硬币 【题目】: 1506 : 投掷硬币 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一枚神奇的硬币。已知第i次投掷这枚硬币时,正面向上的概率是Pi。 现在小Hi想知道如果总共投掷N次,其中恰好M次正面向上的概率是多少。 输入 第一行包含两个整数N和M。 第二行包含N个实数P1, P

Codeforces Round #281 (Div. 2) 解题报告 A.B.C.D.

A - Vasya and Football 纯模拟。。比较坑的是会有不符合足球常识的地方。。 代码如下: #include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctype.h>#include

【贪心】---【反硬币】

题目描述 小明正在玩一个“翻硬币”的游戏。 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。 比如,可能情形是:**oo***oooo 如果同时翻转左边的两个硬币,则变为:oooo***oooo 现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢? 我们约定:把翻动相邻的两个硬

2007年-2021年 281个地级市-绿色创新效率相关数据收集

绿色创新效率是一个重要的概念,它涉及到在生产和消费过程中通过技术创新和管理创新来提高资源的利用效率,降低生产成本,减少对环境的负面影响,进而促进经济的可持续发展。这种效率的提升对企业、环境和社会都有积极的影响: 1. **经济效益**:绿色创新有助于降低企业的生产成本,提高其经济效益,从而增强市场竞争力。 2. **环境保护**:通过减少环境污染,绿色创新有助于保护生态环境,促进生态文明建设和社

281 基于matlab的路径规划GUI交互

基于matlab的路径规划GUI交互。包括蚁量系统、蚁周系统、蚁密系统、蚁群系统、免疫混合算法。11种路径规划数据,最多225个规划点。蚁群和免疫算法的参数可进行设置,使得效果最佳。动态显示可视化规划结果。程序已调通,可直接运行。

centos7中安装JDK8-281版本

#1.删除openjdk rpm -qa | grep java #2.删除上面的文件  rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.242.b08-1.el7.x86_64 rpm -e --nodeps java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64  #3.下载JDK