砝码称重问题算法设计实验3_1
- 格式:doc
- 大小:75.50 KB
- 文档页数:6
实验名称:称重实验实验目的:1. 了解称重的原理和方法。
2. 学会使用天平进行称量。
3. 培养学生的实验操作能力和数据分析能力。
实验时间:2023年X月X日实验地点:学校实验室实验器材:1. 天平2. 砝码3. 药匙4. 烧杯5. 砂纸6. 实验记录表实验步骤:一、准备阶段1. 实验前,检查天平是否水平,确保天平的准确性。
2. 将天平放置在平稳的桌面上,调整天平的零点。
3. 准备好所需的实验器材,并放置在实验台上。
二、实验阶段1. 取一个烧杯,用天平称出其质量,记录在实验记录表中。
2. 使用药匙取适量的砝码,放在烧杯中,再次用天平称出烧杯和砝码的总质量,记录在实验记录表中。
3. 计算出砝码的质量,即烧杯和砝码的总质量减去烧杯的质量。
4. 重复步骤2和3,进行多次实验,以减小误差。
5. 使用砂纸轻轻擦拭砝码,确保砝码的清洁。
6. 对比实验结果,分析误差来源。
三、数据处理与分析1. 将实验数据整理成表格,包括烧杯质量、砝码质量、总质量等。
2. 计算出每次实验的误差,分析误差来源。
3. 对比多次实验的结果,找出最佳实验方法。
实验结果:实验次数 | 烧杯质量(g) | 砝码质量(g) | 总质量(g) | 误差(g)------- | -------- | -------- | -------- | --------1 | 50 | 20 | 70 | 0.52 | 50 | 20 | 70 | 0.33 | 50 | 20 | 70 | 0.24 | 50 | 20 | 70 | 0.45 | 50 | 20 | 70 | 0.1通过对比实验结果,我们可以发现,在多次实验中,误差较小,且误差来源主要是天平和砝码的精度。
在实验过程中,我们采取了以下措施来减小误差:1. 选择合适的天平和砝码,确保其精度;2. 保持天平的清洁和干燥,避免误差;3. 在实验过程中,尽量避免外界因素的干扰,如温度、湿度等。
结论:本次实验通过称重实验,使学生了解了称重的原理和方法,学会了使用天平进行称量,培养了学生的实验操作能力和数据分析能力。
砝码称重问题问题:4个砝码,每个重量都是整数克,总重量为40克,放在天平上可以称出1~40克的物体。
求这4个砝码各多少克。
1. 问题分析设4个砝码的重量分别为w1、w2、w3、w4,则w1+w2+w3+w4=40,且w1,w2,w3,w4均为正整数。
假设不相等(假设w1<w2<w3<w4),故砝码中最大为34克。
称重的天平有物体盘和砝码盘,称重时,若砝码只放在砝码盘,则物体质量=砝码盘砝码质量但若砝码盘和物体盘中都放置了砝码,则物体质量=砝码盘砝码质量-物体盘砝码质量从1~40,任意一个数,都应该能找到相应的砝码放置方法。
砝码只有4个,且每次称重时,这4个砝码只能出现0次或者1次,且砝码要么在物体盘,要么在砝码盘,要解该问题,应该转换思路。
假设砝码在物体盘,认定其出现-1次假设砝码在砝码盘,认定其出现1次若该次称重,不需要该砝码,认定其出现0次设4个砝码在每次称重中出现的次数分别为x1,x2,x3,x4,则只有-1、0、1这三种取值如上分析,找到的砝码组合个数应该为40个(即1~40中的任意一个数都有对应的砝码组合)2. C++版[c-sharp:nogutter]view plaincopyprint?1./************************************************************************2. * 4个砝码,每个重量都是整数克,总重量为40克,放在天平上可以称出1~40克的3. * 物体。
求这4个砝码各多少克。
4. * C++版5. ************************************************************************/6.#include <stdio.h>7.8.class CWeight9.{10. int w1,w2,w3,w4; //砝码的重量11.12. //砝码总重量13. static const int TOTALWEIGHT=40;14.15. //4个砝码,w1+w2+w3+w4=40,且w1,w2,w3,w4均为整数,假设不相等(假设w1<w2<w3<w4)故最大为3416. static const int MAXWEIGHT=34;17.public:18. CWeight(){w1=w2=w3=w4=0;}19. ~CWeight(){}20.21. void Calculate();22. bool weight(int w1,int w2,int w3,int w4);23. void output(int w1,int w2,int w3,int w4);24.};25.26.void CWeight::Calculate()27.{28. int w1,w2,w3,w4;29. for (w1=1;w1<=MAXWEIGHT;w1++)30. {31. for (w2=w1+1;w2<=MAXWEIGHT;w2++)32. {33. for (w3=w2+1;w3<=MAXWEIGHT;w3++)34. {35. for (w4=w3+1;w4<=MAXWEIGHT;w4++)36. {37. if (w1+w2+w3+w4==TOTALWEIGHT)38. {39. if (weight(w1,w2,w3,w4))40. {41. printf("w1=%d w2=%d w3=%d w4=%d/n",w1,w2,w3,w4);42. output(w1,w2,w3,w4);43. }44. }45. }46. }47. }48. }49.}50.51.//从1~40,不管哪个重量都要找到相应的砝码放置方法52.//w1,w2,w3,w4分别为4个砝码的重量53.bool CWeight::weight(int w1,int w2,int w3,int w4)54.{55. int w; //物体重量56.57. //砝码只有4个,且每次称重时,这4个砝码只能出现0次或者1次58. //出现时,砝码要么在物体盘,要么在砝码盘,要解该问题,转换思路59. //假设砝码在物体盘,认定其出现-1次60. //假设砝码在砝码盘,认定其出现1次61. //若该次称重,不需要该砝码,认定其出现0次62. //4个砝码在每次称重中出现的次数63. int x1,x2,x3,x4; //只有-1,0,1这三种取值64.65. int count=0; //找到的砝码组合个数66.67. //对1~40中的每个重量,都要找到相应的砝码组合68. //若有一个w(1<=w<=TOTALWEIGHT)没有找到相应的砝码组合,则表明该组砝码值不是所求69. for (w=1;w<=TOTALWEIGHT;w++)70. {71. for (x1=-1;x1<=1;x1++)72. {73. for (x2=-1;x2<=1;x2++)74. {75. for (x3=-1;x3<=1;x3++)76. {77. for (x4=-1;x4<=1;x4++)78. {79. if (w1*x1+w2*x2+w3*x3+w4*x4==w)80. {81. count++;82.83. //找到该重量对应的砝码组合后,继续下一个重量84. x1=x2=x3=x4=2;85. }86. }87. }88. }89. }90. }91.92. //如果找到所有的1~TOTALWEIGHT的砝码组合,则该组砝码值即为所求93. if (count==TOTALWEIGHT)94. return true;95. else96. return false;97.}98.99.//输出1~40中每个重量对应的砝码组合(负数表示该砝码放在物体盘)100.void CWeight::output(int w1,int w2,int w3,int w4) 101.{102. int w; //物体重量103. int x1,x2,x3,x4; //只有-1,0,1这三种取值104.105. //对1~TOTALWEIGHT中的每个重量,都要找到相应的砝码组合106. for (w=1;w<=TOTALWEIGHT;w++)107. {108. for (x1=-1;x1<=1;x1++)109. {110. for (x2=-1;x2<=1;x2++)111. {112. for (x3=-1;x3<=1;x3++)113. {114. for (x4=-1;x4<=1;x4++)115. {116. if (w1*x1+w2*x2+w3*x3+w4*x4==w) 117. {118. printf("w=%2d: ",w);119. if (x1!=0)120. printf("%d ",w1*x1); 121. if (x2!=0)122. printf("%d ",w2*x2); 123. if (x3!=0)124. printf("%d ",w3*x3); 125. if (x4!=0)126. printf("%d ",w4*x4); 127. printf("/n");128.129. //继续下一个重量130. x1=x2=x3=x4=2;131. }132. }133. }134. }135. }136. }137.}138.139.int main()140.{141. CWeight wei;142. wei.Calculate();143.144. return 0;145.}1./************************************************************************2. * 4个砝码,每个重量都是整数克,总重量为40克,放在天平上可以称出1~40克的3. * 物体。
算法设计与分析实验报告实验名称实验1-2 砝码称重问题学院专业班级学号0 姓名任课教师实验时间2012/10/29 1实验内容对于给定的n 种不同砝码,编程计算它们可以称出多少种不同的重量。
2实验环境a)数据输入zhanghaiyanginput.txtb)数据输出.txtc)编程环境环境:Eclipse 3.1语言:Java3算法设计算法分析,算法流程(关键算法必须有),设计内容(类结构设计)4程序说明import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;public class FangMa {public static void main(String[] args) throws NumberFormatException,IOException { int sum[];//初始化称法数组int f[][];//二维数组,第一行存放砝码重量第二行放个数f=new int[3][3];int line=1;//文本读取的行控制变量int n=0;//砝码种数int s=0;//表识可称出的一种称法int a=0,b=0,c=0,count=0;//循环变量和称法总数try{FileInputStream file=new FileInputStream("D:/data/zhanghaiyanginput.txt");//创建文本输入流对象BufferedReader w = new BufferedReader(new InputStreamReader(file));//读取数据流缓存区间String tempString =null;//存放每行读出的字符串while((tempString = w.readLine()) != null){if(line==1){ n=Integer.parseInt(tempString);//读出第一行的字符并转换成砝码种数}if(line==2){String str[] = tempString.split(",");//安“,”将字符串划分成字符数组元素for(int i=0;i<n;i++){f[0][i]=Integer.parseInt(str[i]);//将字符数组元素放入二维数组中}}if(line==3){String str[] = tempString.split(",");for(int i=0;i<n;i++){f[1][i]=Integer.parseInt(str[i]);}}line++;}}catch (FileNotFoundException e) {}sum=new int[20];for( a=0;a<=f[1][0];a++){for(b=0;b<=f[1][1];b++){for(c=0;c<=f[1][2];c++){s=a*f[0][0]+b*f[0][1]+c*f[0][2];//计算称法sum[s]=s;}}}for(int j=0;j<20;j++){if(sum[j]!=0){count++;}}try{FileWriter w=new FileWriter("D:/data/zhanghaiyangoutput.txt");//创建输出文件w.write("共有"+count+"种称法");w.close();}catch(Exception e){}}}import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;public class FangMa {public static void main(String[] args) throws NumberFormatException,IOException { int sum[];//初始化称法数组int f[][];//二维数组,第一行存放砝码重量第二行放个数f=new int[3][3];int line=1;//文本读取的行控制变量int n=0;//砝码种数int s=0;//表识可称出的一种称法int a=0,b=0,c=0,count=0;//循环变量和称法总数try{FileInputStream file=new FileInputStream("D:/data/zhanghaiyanginput.txt");//创建文本输入流对象BufferedReader w = new BufferedReader(new InputStreamReader(file));//读取数据流缓存区间String tempString =null;//存放每行读出的字符串while((tempString = w.readLine()) != null){if(line==1){ n=Integer.parseInt(tempString);//读出第一行的字符并转换成砝码种数}if(line==2){String str[] = tempString.split(",");//安“,”将字符串划分成字符数组元素for(int i=0;i<n;i++){f[0][i]=Integer.parseInt(str[i]);//将字符数组元素放入二维数组中}}if(line==3){String str[] = tempString.split(",");//第三行是读取每种砝码对应的个数for(int i=0;i<n;i++){f[1][i]=Integer.parseInt(str[i]);}}line++;}}catch (FileNotFoundException e) {}sum=new int[20];for( a=0;a<=f[1][0];a++){for(b=0;b<=f[1][1];b++){for(c=0;c<=f[1][2];c++){s=a*f[0][0]+b*f[0][1]+c*f[0][2];//计算称法sum[s]=s;}}}for(int j=0;j<20;j++){if(sum[j]!=0){count++;}}try{FileWriter w=new FileWriter("D:/data/zhanghaiyangoutput.txt");//创建输出文件w.write("共有"+count+"种称法");w.close();}catch(Exception e){}}}5算法复杂性分析针对具体算法,分析复杂性。
c++砝码称重题目【实用版】目录1.C++砝码称重题目概述2.砝码称重问题的解决方案3.C++程序设计实现步骤4.测试用例及结果分析5.总结与展望正文一、C++砝码称重题目概述砝码称重问题是一种经典的计算机算法问题,主要涉及到动态规划和贪心算法。
该问题描述如下:有 n 个砝码,每个砝码有一个重量,要求用这些砝码组合成目标重量,求解最少需要用多少个砝码。
二、砝码称重问题的解决方案对于砝码称重问题,可以采用贪心算法求解。
具体步骤如下:1.将目标重量与砝码重量进行比较,如果目标重量小于等于砝码重量,则直接返回 1,表示只需要一个砝码即可达到目标重量;2.创建一个数组 dp,用于存储以每个砝码结尾的方案数。
初始时,dp[0] = 1,表示没有砝码的情况下,方案数为 1;3.遍历数组 dp,对于每个 dp[i],计算 dp[i - w] + 1,其中 w 为砝码重量,表示用 i 个砝码可以省略一个砝码重量为 w 的砝码;4.更新 dp[i] = min(dp[i], dp[i - w] + 1),表示选择 i 个砝码中最优的方案;5.遍历完成后,返回 dp[n],表示用 n 个砝码最少需要用多少个砝码。
三、C++程序设计实现步骤以下是 C++程序设计实现砝码称重问题的代码示例:```cppint knapsack(int W, int wt[], int n) {int dp[n + 1];dp[0] = 1;for (int i = 1; i <= n; i++) {for (int j = 0; j < i; j++) {if (wt[j] <= W) {dp[i] = min(dp[i], dp[i - j] + 1);}}}return dp[n];}```四、测试用例及结果分析以下是一个测试用例:```cppint main() {int wt[] = {1, 2, 3, 4, 5};int W = 8;int n = sizeof(wt) / sizeof(wt[0]);int ans = knapsack(W, wt, n);cout << "最少需要用 " << ans << " 个砝码。
【砝码称重问题】--------------------------------------------------------------------------------发表日期:2004年4月3日已经有300位读者读过此文曾经有人出过这样一道题:怎样用四颗砝码,用天平把直到40磅为止的各个整数磅数的物体称出来?法国数学家巴舍·德·梅齐里亚克(Bachet de Meiziriac)在他的《数学趣题》(1624年)中,提到了这个问题。
这个问题用二进制砝码是解决不了的,尽管如今的计算机都要使用二进制。
因为用1磅、2磅、4磅、8磅四块砝码最多只能称出1+2+4+8=15磅的物体。
很自然我们会想到二进制不行,那么试试三进制看看行不行,1+3+9+27=40磅正好符合我们的要求。
虽然最大我们能够称出40磅的物体来,但是1、3、9、27的各种组合只有1、3、4、9、10、12、13、27、28、30、31、36、37、39、40磅,其中缺少许多整数磅。
不过我们有一种巧妙的方法,可以解决这个难题,我们可以把砝码加在天平上那个称东西的盘子上,因此,这块砝码不是要加在称出的重量上面,而是要从中减去的数。
比如5=9-3-1、6=9-3、7=9+1-3等等。
为了达到这个目的,这里所用的三进制数码不是通常的0、1、2,而是-1、0、1。
不错,在用3作为底数时,所用数码是0、1、2,但是2可以写成3-1,因此可以化成-1这个数字。
下面可以看到这么处理的方便之处。
为了简便,我们把-1写成i,以后只要在三进制中碰到2这个数字,我们就把它改写成1i(即3-1=2)例如,三进制中的22102这个数,可以用下面的加法表改写成10i11i。
+ 1 i1 1i 0i 0 i122102= 1i1i11i (+———————10i11i为了称出14磅,先将14化成普通三进制112,再改写成1iii,方法如下:112= 1101i (+———————1iii这就是说,我们应该把27这块砝码放进砝码盘,而把9、3、1三块砝码放进称物盘中:27-9-3-1=14再看怎样称出35磅来,35=27+6+2=(1022)3=110i,所以应该把27、9这两块砝码放进砝码盘,而把1磅这块砝码放进称物盘中。
Python蓝桥杯真题——砝码称重问题描述:你有⼀架天平和 N 个砝码,这 N 个砝码重量依次是 W1, W2, · · · WN请你计算⼀共可以称出多少种不同的重量?注意砝码可以放在天平两边输⼊的第⼀⾏包含⼀个整数 N第⼆⾏包含 N 个整数:W1, W2, W3, · · · WN输出⼀个整数代表答案输出⼀个整数代表答案样例输⼊31 4 6样例输出10n=int(input())a=list(map(int,input().split()))sum=0for i in a:sum+=idp=[[0]*2*sum for i in range(n+1)]result=0for p in range(1,n+1):for q in range(1,sum+1):dp[p][q]=dp[p-1][q]if dp[p][q] == 0:if a[p-1]==q:dp[p][q]=1if dp[p-1][a[p-1]+q]:dp[p][q]=1print(p,q)if dp[p-1][abs(a[p-1]-q)]:dp[p][q]=1for i in dp[n]:if i==1:result+=1print(result)输⼊格式就不解释了!哈 sum就是对所有砝码重量求和创建dp[p][q]疑问1:为什么dp[p]=2*sum*[0]?>>防⽌index out of range索引越界......因为a[p-1]<sum,q<=sum,所以取2保证不越界为什么是2?不可以是3吗?>>先给出结论:⼤于等于2都可以疑问2:p,q的含义 dp[p]代表加上第p个砝码之后 所能称出的所有情况若dp[p][q]=1 代表加上第p个砝码之后 q的情况可以被测出 ...所以为0就是测不出来拉-。
-其次 a[p-1]代表加上的那第p个砝码的单个重量创建两层循环疑问1:p,q的范围怎么知道的?>>假设给你3个砝码,当然是从1 考虑到 3 鸭....最后的答案就是根据dp[3]⾥⾯出现的1的次数确定(也就是最后四⾏代码的含义所在)>>再假设给你的那3个砝码是 1 4 6 不管你怎么称 最⼤的情况就是全部数字加起来,最⼩的情况就是最⼩的数字赋值 dp[p][q]=dp[p-1][q]疑问:为什么要这么赋值?>>拿我们刚刚砝码来说(假设重量未知哈),假设你已经知道加上第⼆个砝码后 可以称出q的重量 ,那现在轮到加第三个砝码,q的重量能否称出来?当然是可以的呀,你不要放第三个砝码就⾏了莫~所以如果dp[p][q]=1 此后下⾯的语句都不执⾏来到最难理解也是最关键的代码段:⾸先 思考你现在有三样东西:⼿中拿着的砝码a[p-1](第p个砝码),上⼀轮所能测出重量的所有数据dp[p-1],待测数据qq从1--sum遍历访问,⾸先q在上⼀轮⼀定是不能测出来,所以我要在这⼀轮尝试测出来:测出⼀组数据需要两样东西 ⼀个是你⼿⾥的砝码⼀个是你已知的重量数据(你可能会问数据是数据,砝码是砝码,两个不同的东西怎么能放在⼀块测量?),不⽤着急,那我们就先忽略‘重量数据呗’。
天平砝码实验的实验报告天平砝码实验的实验报告摘要:本实验旨在通过天平砝码实验,探究物体的质量与砝码的质量之间的关系。
通过实验,我们可以了解到物体质量的测量方法以及天平砝码的使用技巧。
实验结果表明,物体的质量与砝码的质量成正比,且通过天平砝码实验可以准确测量物体的质量。
引言:物体的质量是物体固有的属性,是物体所拥有的物质的量度。
质量的测量方法有多种,其中使用天平砝码是一种常见且准确的方法。
天平砝码实验是物理学中最基本的实验之一,通过该实验可以了解到物体质量的测量原理以及天平砝码的使用技巧。
实验步骤:1. 准备实验仪器:天平、砝码、待测物体。
2. 将待测物体放在天平的一个盘子上,使天平保持平衡。
3. 逐渐增加砝码的质量,直到天平再次保持平衡。
4. 记录下砝码的质量,即可得到待测物体的质量。
实验结果与分析:在本次实验中,我们选择了一块质量未知的物体进行测量。
通过逐渐增加砝码的质量,我们发现当砝码的质量达到一定数值时,天平再次保持平衡。
根据实验结果,我们可以得出结论:物体的质量与砝码的质量成正比。
在实验过程中,我们还发现了一些现象。
首先,当砝码的质量增加时,天平的平衡位置会发生变化,这是因为砝码的质量增加导致天平的重量增加,从而改变了天平的平衡位置。
其次,当砝码的质量增加到一定程度后,天平会出现不平衡的情况,这是因为砝码的质量过大,超过了待测物体的质量,导致天平无法保持平衡。
实验误差与改进:在进行实验的过程中,我们注意到了一些潜在的误差来源。
首先,天平的精度可能会影响实验结果的准确性,因此我们应该选择精度更高的天平进行实验。
其次,人为操作的误差也可能会导致实验结果的偏差,为了减小这种误差,我们可以多次重复实验,取平均值作为最终结果。
结论:通过天平砝码实验,我们可以准确测量物体的质量。
实验结果表明,物体的质量与砝码的质量成正比。
在实验过程中,我们还发现了一些现象,如天平平衡位置的变化等。
为了提高实验结果的准确性,我们还可以注意减小实验误差。
砝码最少称重最大
题目:要用天平称出1克,2克,3克,……127克这些不同的整数克重量,至少要用多少个砝码?这些砝码的重量分别是多少?(称重时,砝码放在天平的右盘,物体放在天平的左盘。
)
分析与解:(1)要称1克的重量,只能用一个1克的砝码去称;
(2)要称重2克,有2种方案:①增加一个1克的砝码,②用一个2克的砝码;
(3)要称重3克(1+2),用上面方案②,淘汰方案①; (4)要称重4克,有4种方案:①增加一个1克的砝码,②增加一个2克的砝码,③用一个3克的砝码,④用一个4克的砝码;
(5)要称重5克,用上面的方案②③④均可,淘汰方案①;
(6)要称重6克,用上面的方案③④均可,接着淘汰方案②;
(7)要称重7克(1+2+4),用上面的方案④,接着淘
汰方案③;
(8)依此类推,称重15克,可利用1+2+4+8=15(克)而且,能够依次称到15克以内的任意整数克重; (9)而要称重127克以内任意整数克重,按上述规律砝码为:1+2+4+8+16+32+64=127(克)。
所以此题答案为砝码至少要7个,重量分别为1 ,2,4 , 8, 16, 32, 64克时,所用砝码最少,称重最大。
这个结论我们还能够推广,当天平左盘放物体右盘放砝码时,使用1,2,, ,……,克砝码能够称出1,2,3,……,(2×-1)克重的重量。
算法设计与分析实验报告
实验名称实验1-2 砝码称重问题
学院专业班级
学号0 姓名
任课教师实验时间2012/10/29 1实验内容
对于给定的n 种不同砝码,编程计算它们可以称出多少种不同的重量。
2实验环境
a)数据输入
zhanghaiyanginput.txt
b)数据输出
.txt
c)编程环境
环境:Eclipse 3.1
语言:Java
3算法设计
算法分析,算法流程(关键算法必须有),设计内容(类结构设计)
4程序说明
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
public class FangMa {
public static void main(String[] args) throws NumberFormatException,IOException { int sum[];//初始化称法数组
int f[][];//二维数组,第一行存放砝码重量第二行放个数
f=new int[3][3];
int line=1;//文本读取的行控制变量
int n=0;//砝码种数
int s=0;//表识可称出的一种称法
int a=0,b=0,c=0,count=0;//循环变量和称法总数
try{
FileInputStream file=new FileInputStream("D:/data/zhanghaiyanginput.txt");//创建文本输入流对象
BufferedReader w = new BufferedReader(new InputStreamReader(file));//读取数据流缓存区间
String tempString =null;//存放每行读出的字符串
while((tempString = w.readLine()) != null){
if(line==1){ n=Integer.parseInt(tempString);//读出第一行的字符并转换成砝码种数
}
if(line==2){
String str[] = tempString.split(",");//安“,”将字符串划分成字符数组元素
for(int i=0;i<n;i++){f[0][i]=Integer.parseInt(str[i]);//将字符数组元素放入二维数组中
}}
if(line==3){
String str[] = tempString.split(",");
for(int i=0;i<n;i++){f[1][i]=Integer.parseInt(str[i]);
}}
line++;
}
}catch (FileNotFoundException e) {
}
sum=new int[20];
for( a=0;a<=f[1][0];a++){
for(b=0;b<=f[1][1];b++){
for(c=0;c<=f[1][2];c++){
s=a*f[0][0]+b*f[0][1]+c*f[0][2];//计算称法
sum[s]=s;
}
}
}
for(int j=0;j<20;j++){
if(sum[j]!=0){count++;}
}
try{
FileWriter w=new FileWriter("D:/data/zhanghaiyangoutput.txt");//创建输出文件
w.write("共有"+count+"种称法");
w.close();
}catch(Exception e){}
}
}import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
public class FangMa {
public static void main(String[] args) throws NumberFormatException,IOException { int sum[];//初始化称法数组
int f[][];//二维数组,第一行存放砝码重量第二行放个数
f=new int[3][3];
int line=1;//文本读取的行控制变量
int n=0;//砝码种数
int s=0;//表识可称出的一种称法
int a=0,b=0,c=0,count=0;//循环变量和称法总数
try{
FileInputStream file=new FileInputStream("D:/data/zhanghaiyanginput.txt");//创建文本输入流对象
BufferedReader w = new BufferedReader(new InputStreamReader(file));//读取数据
流缓存区间
String tempString =null;//存放每行读出的字符串
while((tempString = w.readLine()) != null){
if(line==1){ n=Integer.parseInt(tempString);//读出第一行的字符并转换成砝码种数
}
if(line==2){
String str[] = tempString.split(",");//安“,”将字符串划分成字符数组元素
for(int i=0;i<n;i++){f[0][i]=Integer.parseInt(str[i]);//将字符数组元素放入二维数组中
}}
if(line==3){
String str[] = tempString.split(",");//第三行是读取每种砝码对应的个数
for(int i=0;i<n;i++){f[1][i]=Integer.parseInt(str[i]);
}}
line++;
}
}catch (FileNotFoundException e) {
}
sum=new int[20];
for( a=0;a<=f[1][0];a++){
for(b=0;b<=f[1][1];b++){
for(c=0;c<=f[1][2];c++){
s=a*f[0][0]+b*f[0][1]+c*f[0][2];//计算称法
sum[s]=s;
}
}
}
for(int j=0;j<20;j++){
if(sum[j]!=0){count++;}
}
try{
FileWriter w=new FileWriter("D:/data/zhanghaiyangoutput.txt");//创建输出文件
w.write("共有"+count+"种称法");
w.close();
}catch(Exception e){}
}
}
5算法复杂性分析
针对具体算法,分析复杂性。
该部分内容要有过程说明。
for( a=0;a<=f[1][0];a++){
for(b=0;b<=f[1][1];b++){
for(c=0;c<=f[1][2];c++){
s=a*f[0][0]+b*f[0][1]+c*f[0][2];//计算称法
sum[s]=s;
}
}
}
此处三重循环,循环的总次数位a*b*c
for(int j=0;j<20;j++){
if(sum[j]!=0){count++;}
}
此处循环的次数为数组的长度
综上所述,所以复杂度为a*b*c
6实验结果
a)输入参数
第一行为砝码种类的个数
第二行为不同重量的砝码
第三行为各个砝码的个数
b)输出结果
输出可称出重量的总数
7实验总结
关键算法为:
for( a=0;a<=f[1][0];a++){
for(b=0;b<=f[1][1];b++){
for(c=0;c<=f[1][2];c++){
s=a*f[0][0]+b*f[0][1]+c*f[0][2];//计算称法
sum[s]=s;
}
}
}
此关键算法具有一定的局限性,它仅是在知道不同重量的砝码个数n确定的前提下设计循环的层数的,当n很大的时候就显得复杂了,也不好简写成其他的代码,比较麻烦,并且复杂度也是成指数增长的,最大的复杂度可达m^n(m为每个不同重量的砝码的个数)。