【转】http://blog.youkuaiyun.com/zxy_snow/article/details/6005768
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
int sum,ways;
int num[1010];
int value,n;
void DFS(int x)
{
if( sum == value )
{
ways++;
return ;
}
for(int i=x; i<=value; i++)
{
if( num[i] && sum + i <= value )
{
num[i]--;
sum += i;
DFS(i);
num[i]++;
sum -= i;
}
}
}
int main(void)
{
int x,y;
int pe = 0;
while( cin >> value >> n )
{
if( pe )
cout << endl;
pe = 1;
memset(num,0,sizeof(num));
sum = ways = 0;
for(int i=0; i<n; i++)
{
cin >> x >> y;
num[x] = y;
}
DFS(1);
cout << ways << endl;
}
return 0;
}
本文通过使用C++实现了一种基于深度优先搜索(DFS)的算法来解决一类组合问题,该问题要求计算出达到特定数值目标的所有可能组合方式的数量。文章详细展示了如何定义递归函数,并利用数组记录可用元素的频率来避免重复计数。
1032

被折叠的 条评论
为什么被折叠?



