后端--记忆化搜索算法
1.数字三角形
1 #include "stdafx.h" 2 #include "string.h" 3 #define maxn 4 4 int a[maxn][maxn],n; 5 int d[maxn][maxn]; //记忆化搜索所使用的状态记忆数组 6 inline max(int x,int y) 7 { 8 return x>y?x:y; 9 } 10 int distance(int i,int j) 11 { 12 if(d[i][j]>=0) return d[i][j]; 13 return d[i][j]=a[i][j]+(i==n?0:max(distance(i+1,j),distance(i+1,j+1))); 14 } 15 int main() 16 { 17 while(~scanf("%d",&n)) 18 { 19 int i,j; 20 for(i=1;i<=n;i++){ 21 for(j=1;j<=i;j++) 22 scanf("%d",&a[i][j]); 23 } 24 memset(d,-1,sizeof(d)); //状态记忆化数组初始化 25 printf("max:%d\n",distance(1,1)); 26 } 27 return 0; 28 }
2.背包问题
1 #include "stdafx.h" 2 int c[10][20];/*对应每种情况的最大价值*/ 3 int knapsack(int m,int n) 4 { 5 int i,j,w[10],p[10]; 6 printf("请输入每个物品的重量,价值:\n"); 7 for(i=1;i<=n;i++) 8 { scanf("%d %d",&w[i],&p[i]); 9 printf("\n"); 10 } 11 for(i=0;i<10;i++) 12 for(j=0;j<20;j++) 13 c[i][j]=0;/*初始化数组*/ 14 for(i=1;i<=n;i++) 15 for(j=1;j<=m;j++) 16 { 17 if(w[i]<=j)/*如果当前物品的容量小于背包容量*/ 18 { 19 if(p[i]+c[i-1][j-w[i]]>c[i-1][j]) 20 /*如果本物品的价值加上背包剩下的空间能放的物品的价值, 大于上一次选择的最佳方案则更新c[i][j]*/ 21 c[i][j]=p[i]+c[i-1][j-w[i]]; 22 else 23 c[i][j]=c[i-1][j]; 24 } 25 else 26 27 c[i][j]=c[i-1][j]; 28 } 29 return(c[n][m]); 30 } 31 int main() 32 { 33 int m,n; 34 printf("请输入背包的承重量,物品的总个数:\n"); 35 scanf("%d %d",&m,&n); 36 printf("旅行者背包能装的最大总价值为%d",knapsack(m,n)); 37 printf("\n"); 38 return 0; 39 }
浙公网安备 33010602011771号