硬币兑换问题回溯法伪代码
作者&投稿:徭冠 (若有异议请与网页底部的电邮联系)
static int s;s是存放每列状态的数初始为0代表一列都没翻,第几位为1就代表第几列被翻转
int turncoin(A,S,N,n) //A(N*9数组) ,N是行数 n代表当次翻哪一列 初次调用n=0,代表第一列
{ int i=1;//因为每列只有两种状态,所以每列只翻一次
static int max=0;//用来存放翻转后正面朝上的最大硬币数;
static int S;//大S用来存储当前硬币堆的翻转状态
do {turncoin(A,S,N,n+1);if (n==8){ int tem=sum //sum为遍历A数组,所有元素之和(即为当前正面朝上的硬币数)
if(sum>max){S=s; //把当前翻转状态存储到S,S内总是存储着拥有正面朝上硬币数量最高的一种翻转状态;}}}while(i--&&transform(N,n));
//transform()函数翻转第N列的硬币 并且对s的第n位置一 成功返回ture 并且对是 实现就是for(i=0;
i
拓展资料:
一、题目描述:
一个翻硬币的游戏,有N(N <=10000)行硬币,每行有九个硬币,排成一个N*9的方阵,有的硬币正面朝上,有的反面朝上。我们每次可把一整行或者一整列的所有硬币翻过来,请问怎么翻,使得正面朝上的硬币尽量多(翻硬币无次数限制)。
二、思路分析:
枚举2^9种列的翻法。
遍历N行,如果某行正面朝上的少,翻之;如果正面朝上的多,不翻
记下使得正面最多的方法即可
耗时O(2^9 * N)
这个得到的是最优解.用位运算效率还是很高的.
对每一列,都用一个9位的数表示,一共有N个
然后便利所有的9位状态,(000000000)-(111111111) (二进制)
对于每个状态,都与这N个数异或,每次异或后累加所有的1的值假设为k,如果k小于5则k=9-k.
对N个数累加所有的k,得到最终累加和.
求出所有状态下累加和最大的,就是正面朝上的硬币尽量多的个数.
翻面的方法横列分别是最优解的8位状态和与之对应的每个数异或后累加和k是否小于5.
硬币兑换问题回溯法伪代码
A数组用来存放硬币,数值1代表正面,0代表反面;static int s;s是存放每列状态的数初始为0代表一列都没翻,第几位为1就代表第几列被翻转int turncoin(A,S,N,n) \/\/A(N*9数组) ,N是行数 n代表当次翻哪一列 初次调用n=0,代表第一列 { int i=1;\/\/因为每列只有两种状态,所以每列只...
宦兴舒志: for a=0 to 49 for b=0 to 24 c=49-a-b if a+2*b+5*c=100 ?"一分硬币个数:",a,"二分硬币个数:",b,"五分硬币个数:",c endif endfor endfor
保靖县18362223852: C语言一元硬币兑换问题 - ?
宦兴舒志: x+2y+5z+10m+20n+50t=100 (x,y,z,m,n,t是自然数) 求出每个都范围如x>=0&&x<=100; 然后利用循环求得每个都值 for(x有效) for(y有效) for(z有效) for(m有效) for(n有效) for(t有效) { if(x+2y+5z+10m+20n+50t==100) printf("输入每个都值);};
保靖县18362223852: . 编写C++风格的程序,解决百钱问题,将1元人民币兑换成1,2,5分的硬币,有多少种换法? - ?
宦兴舒志: #include <iostream> using namespace std; int main() { int i,j,k; int sum=0; for(i=0;i<=100;i++) for(j=0;j<=50;j++) for(k=0;k<=20;k++) { if(i*1+2*j+5*k==100) sum++; } cout<<"总数为:"<<sum<<endl; } 已经通过g++编译,运行过,结果是541.
保靖县18362223852: 把一元钱全兑换成1分,2分,5分的硬币,有多少种兑换方法?用C语言编程. - ?
宦兴舒志: #include<stdio.h> main() { int i,j,k; int rmb=1000; int sum=0; for(i=1;;i++) { for(j=1;;j++) { for(k=1;;k++) { if((i+2*j+5*k)==1000) sum++; } } } printf("%d",sum); }
保靖县18362223852: vf程序设计题:将一元纸币兑换成一分、两分和五分的硬币,要求兑换硬币的总数为50 - ?
宦兴舒志: ?"1分","2分","5分" FOR i=1 TO 100 FOR j=1 TO 50 FOR k=1 TO 20 IF 1*i+2*j+5*k=100 .and. i+j+k=50 ?i,j,k ENDIF ENDFOR ENDFOR ENDFOR
保靖县18362223852: C语言,换零食.把一元钱全兑换成硬币,有多少种兑换方法 - ?
宦兴舒志: #include <stdio.h> int main() { int cnt=0, i,j,k ; for( i=0;i<=20;i++ )for( j=0;j<=50;j++ )for( k=0;k<=100;k++ )if ( i*5 + j*2 + k == 100 ) //5分 2分 1分cnt++; printf("%d\n", cnt ); return 0; }
保靖县18362223852: c语言编程用一元五角人民币兑换五分两分和一分的硬币,每一种方案硬币总数不能超过一百枚,问几种兑换方案 - ?
宦兴舒志: 补充一下,刚才我发的代码是总数小于100,如果是不大于应将
保靖县18362223852: 钱币兑换问题 - ?
宦兴舒志: 结果是有的,但不正确.代码中少了对m负数的判断.int main() { int n; while(scanf("%d",&n)!=EOF) { int m; int a=0; int x,y; for(x=0;x { for(y=0;y { m=n-x-2*y; if(m%3==0&&m>=0)//here { a++; }} } printf("%d\n",a); a = 0; } return 0; }
保靖县18362223852: 设计一个python程序,计算人民币与其它货币之间汇率的兑换关系 - ?
宦兴舒志: 两者为同向关系.人民币币值高则汇率也高.汇率是指本币与外币之间的比值.当人民币币值升高时,势必在同等汇率下,一定本币可以兑换外币,这就是人民币汇率高的表现.也就是说人民币币值高是汇率高的前提,汇率是币值的表现. 拓展资料 汇率是指一国货币与另一国货币的比率或比价,或者说是用一国货币表示的另一国货币的价格.汇率变动对一国进出口贸易有着直接的调节作用.在一定条件下,通过使本国货币对外贬值,即让汇率下降,会起到促进出口、限制进口的作用;反之,本国货币对外升值,即汇率上升,则起到限制出口、增加进口的作用. 资料来源:百度百科
保靖县18362223852: 将一元人民币兑换成1,2,5分的硬币,有多少种换法?用C++编程 - ?
宦兴舒志: 这就是线性规划的问题:我编的一个,从(0,0,0,)检验到(100,100,100)的程序就可以算出总的方法数和每种的具体过程,两个向量就表示从一个一分,两分,五分,一直检验到一百个一分,两分和五分.具体程序如下: #include<iostream.h...