要求:
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));
}
}