后端--记忆化搜索算法

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 }

 


posted @ 2016-05-11 12:51  序源  阅读(143)  评论(0)    收藏  举报