Square Coins

Problem Description
People in Silverland use square coins. Not only they have square shapes but also their values are square numbers. Coins with values of all square numbers up to 289 (=17^2), i.e., 1-credit coins, 4-credit coins, 9-credit coins, ..., and 289-credit coins, are available in Silverland.
There are four combinations of coins to pay ten credits:

ten 1-credit coins,
one 4-credit coin and six 1-credit coins,
two 4-credit coins and two 1-credit coins, and
one 9-credit coin and one 1-credit coin.

Your mission is to count the number of ways to pay a given amount using coins of Silverland.
 

Input
The input consists of lines each containing an integer meaning an amount to be paid, followed by a line containing a zero. You may assume that all the amounts are positive and less than 300.
 



Output
For each of the given amount, one line containing a single integer representing the number of combinations of coins should be output. No other characters should appear in the output.
 

Sample Input
  
2 10 30 0
 

Sample Output
  
1 4 27
#include<stdio.h>
#include<string.h>
int a[400],b[400];
int main(){
	int n,i,j,k;
	while(~scanf("%d",&n))
    {
    	if(n==0)
    	break;
    	memset(a,0,sizeof(a));
    	memset(b,0,sizeof(b));
    	for(i=0;i<=n;i++)
    	{
    		a[i]=1;b[i]=0;
    	}
    	for(i=2;i<=n;i++)
    {
    	for(j=0;j<=n;j++)
    	for(k=0;k+j<=n;k+=i*i)
    	b[k+j]+=a[j];
        for(int i=0;i<=n;i++)
        {
        	a[i]=b[i];b[i]=0;
        }
    }
    printf("%d\n",a[n]);
    }
	return 0;
}




clc; clear all; [filename,pathname]=uigetfile({'*.jpg;*.tif;*.png;*gif','all imagine files';'*.*','all files'},'select your photo'); path=[pathname,filename]; image=imread(path); % axes(handles.photo); imshow(image);%显示图片 %image processing I=rgb2gray(image); I=rangefilt(I);%滤波 background = imopen(I,strel('disk',11));%使用形态学开来估计背景 I2 = I-background;%从原始图像中减去背景图像 I3 = imadjust(I2);%增强对比度 bw = imbinarize(I3);%阈 值图像 bw = bwareaopen(bw,160);%降噪150,160 bw=edge(bw,'canny'); %边缘检测 %bw=1-bw; % axes(handles.a1); imshow(bw); %se=strel('disk',13);%15 se=strel('square',15);%15 bw1=imclose(bw,se);%闭 bw2=imdilate(bw1,se);%膨胀 bw2=imerode(bw2,se);%腐蚀 bw3=imfill(bw2,'holes'); % axes(handles.a2); imshow(bw3); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %circle detection rmin = 20; rmax = 2500; radiusRange=[rmin rmax]; [center, rad] = imfindcircles(bw3,radiusRange,'EdgeThreshold',0.13);%检测灵敏度(边缘渐变阈值)0.3 display(center); display(rad); % axes(handles.a3); imshow(bw3); viscircles(center, rad,'Color','b'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %initialize the number of coins one=0; half=0; little=0; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %coin recognition [m,n]=size(rad); num=m; i=1; j=num; min=rad(i); max=rad(j); while i<=j if rad(i)<rad(j) if rad(i)<min min=rad(i); else if rad(j)<max max=rad(j); end end else if rad(j)<min min=rad(j); else if rad(i)<max max=rad(i); end end end i=i+1; j=j-1; end sum=0; for i=1:num sum=rad(i)+sum; end % ave=(sum-(min+max))/(num-2); ave = sum/num; for i=1:num if 0.6<(rad(i)/ave)&&(rad(i)/ave)<1.5 if rad(i)>ave one=one+1; else if 0.93<(rad(i)/ave) && rad(i)<=ave half=half+1; else little = little+1; end end end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %display results sum=half*0.5+one+little*0.1; one half little sum这段代码什么意思
06-12
这段代码是一个基于图像处理的硬币识别程序,主要流程如下: 1. 读入一张图片并进行预处理,包括灰度化、滤波、背景估计、去除背景、增强对比度、二值化、降噪、边缘检测等操作。 2. 检测图片中的圆形物体,通过调整边缘渐变阈值来控制检测的灵敏度。 3. 根据检测到的圆形物体的大小和数量,识别硬币的面值,并输出结果。 具体来说,代码中的变量和函数含义如下: - filename, pathname:从用户选择的文件中获取图片路径和文件名。 - image:读入的原始图片。 - I:灰度化后的图片。 - rangefilt:滤波函数,用于平滑图像。 - background:使用形态学开来估计背景,得到背景图像。 - I2:从原始图像中减去背景图像,得到纯前景图像。 - imadjust:增强图像对比度。 - imbinarize:将灰度图像二值化。 - bwareaopen:移除面积小于一定值的连通区域。 - edge:边缘检测函数。 - se:构造形态学结构元素。 - imclose:闭运算函数。 - imdilate:膨胀函数。 - imerode:腐蚀函数。 - imfill:填充连通区域。 - rmin, rmax:圆形物体的最小半径和最大半径。 - imfindcircles:检测圆形物体的函数,返回圆心和半径。 - viscircles:将检测到的圆形物体可视化。 - one, half, little:分别表示1元硬币、0.5元硬币和0.1元硬币的数量。 - num:圆形物体的数量。 - ave:圆形物体半径的平均值。 - sum:圆形物体半径的总和。 整个程序的核心部分是硬币识别,根据圆形物体的大小关系(半径与平均半径的比值)和数量来判断硬币的面值。其中,判断比值是否在区间[0.6, 1.5]内是为了排除其他圆形物体的干扰,判断半径是否大于平均半径是为了区分1元硬币和0.5元硬币,判断比值是否在区间(0.93, 1.0]内是为了区分0.5元硬币和0.1元硬币。最后输出识别结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值