把一元钞票换成一分、二分、五分硬币(每种至少一枚),有多少种换法?---使用递归

四维兜兜 2012-10-22 11:45:28
我用3个for循环嵌套做了一次,但老师要求用递归,我是菜鸟,不太明白递归怎么用,求高手们指点,先谢谢啦~
...全文
4170 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
s63403048 2012-11-15
  • 打赏
  • 举报
回复
引用 14 楼 cowboyhn 的回复:
按照面值从大到小处理,一张张累加,剩下的能被最小面值整除,则是一种组合。 Java code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071public……
学习了..
四维兜兜 2012-10-25
  • 打赏
  • 举报
回复
感谢14楼朋友的代码,更加感谢1楼的朋友耐心的指点,我按照你的方法写了一遍,运行成功了,代码在上一层,真心感谢,学习了,递归啊,递归....
四维兜兜 2012-10-25
  • 打赏
  • 举报
回复
public class Money_digui_2 {

/**
* @param args
*/
private static final int LEN = 3;

static int[] a={1,2,5};

public static void main(String[] args) {
System.out.println("种数="+pay(100,0));
}

public static int remain(int i){
//求出当前未使用的钞票之和 7 5
int total = 0;
for(int j=LEN-1;j>i;j--)
total += a[j];
return total;
}

private static int pay(int total, int i) {
int count = 0;
if(i>2){
if(total == 0){
//当总钱数减完时,一种方案完成,返回1
return 1;
}
return 0;
}
else {
//判断余额是否小于于等于没用的钞票,如果没有,不能再选当前的钞票了
for(int n=1;total-n*a[i]>=remain(i);n++){
count += pay(total-n*a[i],i+1);
}
}
return count;
}
cowboyhn 2012-10-25
  • 打赏
  • 举报
回复
按照面值从大到小处理,一张张累加,剩下的能被最小面值整除,则是一种组合。

public class PayType {

private static int count=0;
private static int coins[]={1,2,5};
public static void main(String[] args) {
int amount=1*100;
int coinsCount[]=new int[coins.length];
//先每种至少一张
for(int i=coinsCount.length-1;i>=0;i--)
{
amount-=coins[i];
coinsCount[i]=1;
}
//从最大开始付
pay(amount,coinsCount.length-1,coinsCount);
System.out.println("count:"+count);
}

private static void print(int coinsCount[])
{
count++;
String str="";
int total=0;
for(int i=coinsCount.length-1;i>=0;i--)
{
if(i==coinsCount.length-1)
str+=coins[i]+"*"+coinsCount[i];
else
str+="+"+coins[i]+"*"+coinsCount[i];
total+=coins[i]*coinsCount[i];
}
System.out.println(str+"="+total);
}

private static void pay(int amount,int coinIdx,int srcCoinsCount[])
{
int coin=coins[coinIdx];
int[] coinsCount=new int[srcCoinsCount.length];
for(int i=0;i<coinsCount.length;i++)
{
coinsCount[i]=srcCoinsCount[i];
}
//如果是最小一种
if(coinIdx==0)
{
//整除,则合适
if(amount%coin==0)
{
coinsCount[coinIdx]+=amount/coin;
print(coinsCount);
}
return;
}
if(amount>=coin)
{
//用下一种面值付
pay(amount,coinIdx-1,coinsCount);
//继续用当前面值付
coinsCount[coinIdx]++;
amount-=coin;
pay(amount,coinIdx,coinsCount);
}
//不够,则用下一种面值付
else
{
pay(amount,coinIdx-1,coinsCount);
}

}
}
  • 打赏
  • 举报
回复
有点难度!
四维兜兜 2012-10-25
  • 打赏
  • 举报
回复
嗯,说的很在理,我在好好想想,再次感谢楼上的朋友
cstur4 2012-10-24
  • 打赏
  • 举报
回复
你再看看我的代码吧,你的做法很有问题。首先,每张都要用到你就没有考虑到。我的做法是判断没用的钞票是否大于等于余额,如果没有,我们显然不能再选当前的钞票了,要不然不可能满足每种至少一张的。另外,大于等于当前钞票的你考虑了,那么小于的呢?直接不管是不应该的吧?毕竟,我们要的是凑到刚好的总额。
cstur4 2012-10-24
  • 打赏
  • 举报
回复
额,你用递归了,我没看清。
cstur4 2012-10-24
  • 打赏
  • 举报
回复
你不是要递归?怎么又用for了。另外,你要看的是怎么做,别把重点放在用语言上。
四维兜兜 2012-10-23
  • 打赏
  • 举报
回复
代码有问题,排出来的分配方案有重复,求高手指点如何去重...另外感谢1楼提供的C++代码
import java.util.List;
import java.util.ArrayList;

public class TestOnly {

static int count = 0;

public static void main(String[] arg)
{
List<Integer> Cost = new ArrayList<Integer>();

// 用10块试试!
Pay(10, Cost);
System.out.println("种数=" + count);
}

static void Pay(int number, List<Integer> c)
{
int[] numbers = new int[3];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 5;


for (int i = 0; i < 3; i++)
{
if (number - numbers[i] == 0)
{
for (int j = 0; j < c.size(); j++)
{
System.out.print(c.get(j));
}
System.out.println(numbers[i]);
count++;
}
else if (number - numbers[i] > 0)
{
List<Integer> n = new ArrayList<Integer>();
n.addAll(c);
n.add(numbers[i]);
Pay(number - numbers[i], n);
}
}

}
}
四维兜兜 2012-10-23
  • 打赏
  • 举报
回复
我也知道答案是461,我用for循环做了,可是老师要我改成递归的,不会啊?求助啊!!
zly361814478 2012-10-23
  • 打赏
  • 举报
回复
看有没新的方法
soton_dolphin 2012-10-23
  • 打赏
  • 举报
回复
楼上的牛逼呀,顶
cstur4 2012-10-23
  • 打赏
  • 举报
回复
答案是461种。
cstur4 2012-10-23
  • 打赏
  • 举报
回复
C++代码哈

#include<iostream>
using namespace std;
#define LEN 3

int a[] = {1, 2, 5};
int remain(int i){
int total = 0;
for(int j=LEN-1;j>i;j--)
total += a[j];
return total;
}
long dfs(int total, int i){
if(i>=3){
if(total==0)
return 1;
return 0;
}

long res = 0;
for(int num=1;total-a[i]*num>=remain(i);++num){
res += dfs(total-num*a[i], i+1);
}

return res;
}
int main(){
printf("%ld\n", dfs(100, 0));

}

内容概要:本文提出了一考虑构网型储能支撑能力的微电网优化调度策略,通过Matlab代码实现,旨在提升微电网在复杂运行环境下的稳定性与经济性。研究聚焦于构网型储能系统(如虚拟同步发电机VSG)的动态特性及其对微电网频率、电压等关键参数的主动支撑能力,构建了包含光伏、储能、负荷等多元组件的微电网系统模型。采用优化算法(如改进灰狼算法、模型预测控制等)对系统进行日前或实时调度,优化目标涵盖运行成本最小化、可再生能源消纳最大化、储能寿命延长以及系统可靠性提升等多个方面。文中详细阐述了模型构建、算法设计与仿真验证全过程,并通过案例分析证明了所提策略在平抑功率波动、提高能源利用效率和增强系统韧性方面的有效性。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真工具,从事微电网、分布式能源、储能控制等领域研究的研发人员和研究生;尤其适合有一定科研基础、希望深入理解构网型控制与优化调度结合应用的1-3年工作经验的研究者。; 使用场景及目标:① 掌握构网型储能(Grid-Forming Energy Storage)在微电网中的建模方法与控制原理;② 学习如何将储能的主动支撑能力融入优化调度框架,实现源-储-荷协同调控;③ 借助Matlab代码实现完整的微电网优化调度仿真流程,用于科研论文复现、课题开发或工程方案预研。; 阅读建议:此资源以实际Matlab代码为核心,理论与实践紧密结合,建议读者在理解基本电力系统知识的基础上,结合文档中的模型结构与算法逻辑,逐步调试并运行代码,深入掌握每一步的实现细节。同时可参考文中提及的智能优化算法与控制策略,拓展至其他类似电力系统优化问题的研究中。
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 UG(Unigraphics)是一功能完备的计算机辅助设计与制造(CAD/CAM)软件,在机械工程、汽车制造、航空航天等多个行业得到普遍使用。FANUC作为全球领先的数控系统生产商,其数控机床在精密加工领域中得到了广泛部署。"UG FANUC经典后处理"是指为FANUC数控系统专门设计的UG软件后处理技术,它是CAM编程过程中的关键组成部分。 后处理是UG CAM系统的一个构成部分,其核心功能是将由UG生成的刀具路径数据转换为特定数控系统的机器指令,这些指令能够被FANUC数控机床所识别并执行。FANUC18M可能代表FANUC的一个特定型号或版本的控制系统,该系统拥有M代码功能,用于控制机床的多动作。 UG的后处理流程包括对刀具路径的改进、速度与进给率的确定、换刀指令的制定以及切削参数的配置等环节。用户可以根据自己机床的特性与加工需求来设计后处理器,目的是确保生成的代码既高效又安全,同时满足工件精度要求。 "UG FANUC经典后处理"可能集成了一套预设的、适用于FANUC系统的工作参数和代码格式,帮助用户在编程时能够迅速且精确地为FANUC机床生成G代码。这一特性显著简化了编程步骤,减少了错误发生的概率,对于不太熟悉后处理技术的用户而言,是一个极具价值的工具。 在实际操作中,用户可能需要依据工件的材料、形态、大小以及加工方法来调整后处理参数,比如切削速度、进给率、刀具选择等。FANUC18M后处理器通常会提供一系列预设配置,用户可以根据具体情况进行选择和细致调整,以获得最优的加工表现。 除了基础的G代码生成,UG的后处理还可能包含其他高级特性,例如模拟验证。借助UG的...

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧