天下

记录修行的印记

动态规划算法(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;

}

posted on 2013-03-27 09:53 天下 阅读(867) 评论(0)  编辑 收藏 引用 所属分类: 算法


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2013年3月>
242526272812
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿(4)

随笔分类(378)

随笔档案(329)

链接

最新随笔

搜索

最新评论