F - 硬币(dp)

本文探讨了在给定硬币面额及数量的情况下,如何计算从1到最大面额m能组成的面额数。通过状态转移方程dp[j]=dp[j-a[i]]+1,实现了对每种硬币使用情况的标记,避免重复计算,最终输出能组成的面额数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://vjudge.net/contest/279505#problem/F

给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数。 

Input

多组数据,每组数据前两个数字为n,m。n表示硬币种类数,m为最大面额,之后前n个数为每种硬币的面额,后n个数为相应每种硬币的个数。 (n<=100,m<=100000,面额<=100000,每种个数<=1000)

Output

RT

Sample Input

3 10
1 2 4 2 1 1
2 5
1 4 2 1
0 0

Sample Output

8
4

题目分析:状态转移方程dp[j]=dp[j-a[i]]+1,意思就是填充过后的种类=没填充该硬币+1.我们注意用一个数组标记一下每一个硬币的使用情况避免重复计算。

参考代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100005     
#define M 100000000
int vis[N],dp[N],v[N],w[N];int n,m,ans;
int main()
{
	while(~scanf("%d%d",&n,&m)&&n&&m)
	{
		ans=0;
		for(int i=1;i<=n;i++)scanf("%d",&v[i]);
		for(int i=1;i<=n;i++)scanf("%d",&w[i]);
	
		memset(vis,0,sizeof(vis));
		vis[0]=1;
		for(int i=1;i<=n;i++)
		{
			memset(dp,0,sizeof(dp));
			for(int j=v[i];j<=m;j++)
			{
				if(!vis[j]&&vis[j-v[i]]&&dp[j-v[i]]+1<=w[i])
				{
					ans++;
					vis[j]=1;
					dp[j]=dp[j-v[i]]+1;
				}
			}
		}
		printf("%d\n",ans);
		
	}
}  

 

### 硬币计数功能的开发 要实现硬币计数功能,可以利用 OpenCV 和 Python 提供的强大图像处理能力。以下是具体的技术实现方法: #### 图像预处理 在进行硬币检测之前,通常需要对输入图像进行一些基本的预处理操作,以便提高后续边缘检测和形状提取的效果。 1. **读取图像并转换为灰度图** 颜色信息对于硬币检测并不是必需的,因此可以通过 `cv2.cvtColor` 函数将彩色图像转换为灰度图像[^2]。 ```python import cv2 image = cv2.imread('coins.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ``` 2. **高斯模糊去噪** 为了减少噪声的影响,可以在灰度图像上应用高斯模糊过滤器[^3]。 ```python blurred = cv2.GaussianBlur(gray, (9, 9), 0) ``` #### 边缘检测与形态学操作 通过 Canny 边缘检测算法找到图像中的边界像素点,并进一步优化这些边界的连续性和闭合性。 1. **Canny 边缘检测** 使用 `cv2.Canny` 方法获取图像的边缘轮廓。 ```python edges = cv2.Canny(blurred, threshold1=30, threshold2=150) ``` 2. **形态学膨胀填充间隙** 应用形态学操作(如膨胀)使断开的边缘连接起来,形成完整的圆形区域。 ```python kernel = np.ones((5, 5), dtype=np.uint8) dilated_edges = cv2.dilate(edges, kernel, iterations=1) ``` #### 圆形目标检测 Hough 变换是一种常用的方法来检测圆或其他几何图形,在这里我们将它应用于寻找硬币的位置和大小。 1. **霍夫变换圈检测** 利用 Hough Circle Transform 来定位所有的潜在硬币位置及其半径长度。 ```python circles = cv2.HoughCircles(dilated_edges, method=cv2.HOUGH_GRADIENT, dp=1, minDist=blurred.shape[0]/64, param1=200, param2=18, minRadius=10, maxRadius=100) if circles is not None: detected_circles = np.round(circles[0, :]).astype(int) for (x, y, r) in detected_circles: cv2.circle(image, center=(x, y), radius=r, color=(0, 255, 0), thickness=2) ``` #### 统计硬币数目 最后一步就是统计所发现的所有符合条件的硬币总数目,并显示出来或者保存到文件中。 ```python print(f'Number of coins found: {len(detected_circles)}') ``` 以上代码片段展示了如何基于 OpenCV 实现简单的硬币计数逻辑[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值