(算法练习)——神奇的口袋

要求:
http://codeup.cn/problem.php?cid=100000583&pid=2
这一题充分让我觉得我只能写简单的递归(实际这个也不难,但我想的不是这样的,就……写不出来= =需要好好找找一些递归的代码实现来看看)
代码(参考大神的代码写的,也理解了(但为啥自己就想不到呢?))

#include <stdio.h>
#include <string.h>
int count,n,sum;
int record[21];
void search(int index,int sum)
{
	if(sum==0)
	{
		count++;
		return;
	}
	if(index>=n)
		return;
	if(sum-record[index]>=0){
		search(index+1,sum-record[index]);
	}
	search(index+1,sum);	
}
int main(){
	int m;
	while(scanf("%d",&n) != EOF){
		for(int i = 0;i <n;i++){
			scanf("%d",&m);
			record[i] = m;
		}
		count = 0;
		search(0,40);
		printf("%d\n",count);
		memset(record,0,sizeof(record));
	}
}

修改了一下写了一个sum累加的版本(对累加抱有执念= =)

#include <stdio.h>
#include <string.h>
int count,n,sum;
int record[21];
//利用index自动往后加1找到边界 
void search(int index,int sum)
{
	if(sum + record[index]==40)
	{
		count++;
	}
	if(index>=n){
		return;
	}
		
	if(sum + record[index]<40){
		search(index+1,sum + record[index]);
	}
	//这里的参数写的sum系统才给通过,但在本地测试,写search(index+1,0)也能得到答案,存疑
	search(index+1,sum);	
}
int main(){
	int m;
	while(scanf("%d",&n) != EOF){
		for(int i = 0;i <n;i++){
			scanf("%d",&m);
			record[i] = m;
		}
		count = 0;
		//相当于sum初始就是为0 
		search(0,0);
		printf("%d\n",count);
		memset(record,0,sizeof(record));
	}
}
发布了105 篇原创文章 · 获赞 3 · 访问量 1964

猜你喜欢

转载自blog.csdn.net/weixin_42377217/article/details/103996647