动态规划之01背包问题

 

[cpp]  view plain copy
  1. #include  
  2. using namespace std;  
  3. int c[10][100];  
  4. int Knapsack(int n,int m)  
  5.  
  6.     int i,j;  
  7.     int w[10],v[10];  
  8.     for(i=1;i<=n;i++)  
  9.         scanf("%d%d",&w[i],&v[i]);  
  10.     for(i=0;i<10;i++)  
  11.         for(j=0;j<100;j++)  
  12.             c[i][j]=0;  
  13.     for(i=1;i<=n;i++)  
  14.         for(j=1;j<=m;j++)  
  15.          
  16.             if(w[i]<=j)  
  17.              
  18.                   
  19.                 if(c[i-1][j]
  20.                     c[i][j]=v[i]+c[i-1][j-w[i]];  
  21.                 else//否则不更新  
  22.                     c[i][j]=c[i-1][j];  
  23.              
  24.             else  
  25.                 c[i][j]=c[i-1][j];  
  26.          
  27.         return c[n][m];  
  28.  
  29. int main()  
  30.  
  31.     int n,m;  
  32.     printf("input and n/n");  
  33.     scanf("%d%d",&m,&n);  
  34.     printf("%d",Knapsack(n,m));  
  35.     printf("/n");  
  36.     int i,j;  
  37.     for(i=0;i<=n;i++)  
  38.      
  39.         for(j=0;j<=m;j++)  
  40.             printf("=",c[i][j]);  
  41.         printf("/n");  
  42.      
  43.     return 0;  
  44.  
  45.   

 

上面的算法没有提供找最优解序列的方法,下面给出找最有解序列的代码

 

[c-sharp]  view plain copy
  1. #include  
  2. using namespace std;  
  3. int c[10][100];  
  4. int x[10];//存放最优解  
  5. int Knapsack(int n,int m,int w[],int v[])  
  6.  
  7.     int i,j;  
  8.     for(i=0;i<10;i++)  
  9.         for(j=0;j<100;j++)  
  10.             c[i][j]=0;  
  11.     for(i=1;i<=n;i++)  
  12.         for(j=1;j<=m;j++)  
  13.          
  14.             if(w[i]<=j)  
  15.              
  16.                   
  17.                 if(c[i-1][j]
  18.                  
  19.                     c[i][j]=v[i]+c[i-1][j-w[i]];  
  20.                  
  21.                 else//否则不更新  
  22.                  
  23.                     c[i][j]=c[i-1][j];  
  24.                  
  25.              
  26.             else  
  27.              
  28.                 c[i][j]=c[i-1][j];  
  29.              
  30.          
  31.         return c[n][m];//矩阵的最后一个为最优解。  
  32.  
  33.   
  34. void Trackback(int c[][100],int w[],int m,int n)  
  35.  
  36.     int i;  
  37.     for(i=n;i>0;i--)  
  38.      
  39.         if(c[i][m]==c[i-1][m])//表示序号为i的物品没有被装入背包  
  40.             x[i]=0;  
  41.         else  
  42.          
  43.             x[i]=1;  
  44.             m-=w[i];  
  45.          
  46.      
  47.  
  48.   
  49. int main()  
  50.  
  51.     int n,m;  
  52.     int i,j;  
  53.     printf("input and n/n");  
  54.     scanf("%d%d",&m,&n);  
  55.     int w[10],v[10];  
  56.     for(i=1;i<=n;i++)  
  57.         scanf("%d%d",&w[i],&v[i]);  
  58.   
  59.     printf("%d",Knapsack(n,m,w,v));  
  60.     printf("/n");  
  61.   
  62.     for(i=0;i<=n;i++)  
  63.      
  64.         for(j=0;j<=m;j++)  
  65.             printf("=",c[i][j]);  
  66.         printf("/n");  
  67.      
  68.     Trackback(c,w,m,n);//找最优解  
  69.     for(i=1;i<=n;i++)  
  70.         cout<<x[i]<<" 
  71.     cout<<endl;  
  72.     return 0;  
  73.  
  74.   


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值