近几日的算法学习(背包问题+回溯递归算法)附例题
最近两天都没有更新博客力(
其实是去学了些算法,算是对计算机科学有了全新的认识吧(我之前在课本学的是什么勾八玩意儿)
CP1055 有多少个数的和是素数(经典的回溯算法,暴力枚举)
俺的做法:#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include<math.h>
void subArray(int A[], int k,int l, int n);
int y=0;
int c[1000000];//存放子集和的数组
int priArray[1000000];//存放组合的数组
void addArray(int n);
int judge(int o);
int main()
{
int i;
int n;
int m=0;
int count=0,flag=0;
int array[100000];
while(1)//录入数据
{
scanf("%d",&n);
if(n==-1)
{
break;
}
array[m]=n;
m++;
}
for (i = 0; i < m; i++)
{
for (int i = 0; i<= m-1 ; i++)//每一次都要初始化,回溯为零
{
priArray[i] = 0;
}
priArray[0] = array[i];//存储首结点
addArray(1);//直接go
subArray(array, i+1, 2, m);//接着到下一位
}
for(int q=0; q<y; q++)
{
flag=judge(c[q]);
if(flag==1)
{
count++;
}
}
for(int q=0; q<y; q++)
{
if(c[q]==1)
{
count--;
}
}
printf("%d\n",count);
return 0;
}
void subArray(int A[], int k, int l, int n)//l是最初的子集个数,n是最大长度与数组长度
{
int i;
if (k==n-1)//递归终止条件
{
priArray