动态规划算法(5):背包最大价值问题

动态规划算法(5):背包最大价值问题

#include "stdafx.h"

int c[20][100]; /* 对应每种情况的最大价值 */


// int m 背包容量
// int n 背包个数
int knapsack( int m, int n)
{
     int i,j,w[20],p[20];
     for(i=1;i<n+1;i++) 
    {
        printf("请输入第(%d)个物品重量,价值:\n",i);
        scanf("%d,%d",&w[i],&p[i]);
    }    
     for(i=0;i<10;i++)
         for(j=0;j<100;j++)
            c[i][j]=0; /* 初始化数组 */

     for(i=1;i<n+1;i++)
    {
         for(j=1;j<m+1;j++)
        {
             if(w[i]<=j)  /* 如果当前物品的容量小于背包容量 */
            {
                 if(p[i]+c[i-1][j-w[i]]>c[i-1][j])
                {
                     // 如果本物品的价值加上背包剩下的空间能放的物品的价值
                    
// 大于上一次选择的最佳方案,
                    
// 则更新c[i][j]
                    c[i][j]=p[i]+c[i-1][j-w[i]];
                }
                 else 
                {
                    c[i][j]=c[i-1][j];
                }
            }
             else c[i][j]=c[i-1][j];
        }
    }
     return(c[n][m]);
}
int main()
{
     // int m 背包容量
    
// int n 背包个数
     int m,n;
    

    printf("请输入背包最大承重,物品个数:\n");
    scanf("%d,%d",&m,&n);
    
    printf("最大价值:%d \r\n",knapsack(m,n));

     int i,j;

    m += 3;
    n += 3;
     for(j=0;j<m;j++)
    {
        printf("%02d  ",j);
    }
    printf("\r\n");
     for(j=0;j<m;j++)
    {
        printf("----",j);
    }
    printf("\r\n");
     for(i=0;i<n;i++)
    {
         for(j=0;j<m;j++)
        {
            printf("%02d  ",c[i][j]);
             if(j==m-1) printf("\n");
        }
    }
    system("pause");

     return 0;

}

你可能感兴趣的:(动态规划算法(5):背包最大价值问题)