DFS深度优先搜索简单案例:Coin解决方案

本文介绍了一道经典的组合算法题目,通过递归深度优先搜索的方法,寻找所有可能的硬币组合方式来达到指定的目标金额。文章提供了一个详细的C++实现案例。

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

2012创新工场校园招聘的一道编程算法题:有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,求有多少种组合可以组合成n分钱?

/**
* Coin Permutation
* 有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,求有多少种组合可以组合成n分钱?
* @author arhaiyun
* Date: 2013-09-24
*/

#include "stdafx.h"
#include <iostream>
#include <vector>

using namespace std;

int target = 0; //目标coin分数
int curCoins = 0; //当前coin总数

int count = 0;
vector<int> solution; //记录排列解决方案

int coins[] = {1, 2, 5, 10};

void dfsCoinSolution(int index)
{
	if(curCoins == target)
	{
		count++;
		vector<int>::iterator iter = solution.begin();
		cout<<"["<<count<<"]:";
		for(; iter != solution.end(); iter++)
		{
			cout<<(*iter)<<" ";
		}
		cout<<endl;
		
		return;
	}
	
	if(curCoins > target)
		return;

	for(int i = index; i < 4; i++)	
	{
		solution.push_back(coins[i]);
		curCoins += coins[i];
		dfsCoinSolution(i);
		curCoins -= coins[i];
		solution.pop_back();
	}
}


int main(void)
{
	while(1)
	{
		count = 0;
		cin>>target;
		
		if(target <= 0)
			break;
		
		dfsCoinSolution(0);
	}
	
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值