0-1背包问题:给定n种物品和一个容量为c的背包,物品i的重量是wi,其价值是vi

问:应该怎样选择装入背包的物品,使得装入背包的物品的总价值最大?

解:声明一个大小为m[n][c]的二维数组,m[i][j]表示在面对第i间物品,且背包容量为j时所能获得的最大价值,我们就可以分析出m[i][j]的计算方法

(1).j<w[i]的情况,这时候背包容量不足以放下第 i 件物品,只能选择不拿

m[i][j]=m[i-1][j]

(2).j>=w[i]的情况,这时背包容量可以放下第 i 件物品,我们就要考虑拿这件物品是否能获取更大的价值。如果拿取,m[i][j]=m[i-1][j-w[i]]+v[i]。这里的m[ i-1 ][ j-w[ i ] ]指的就是考虑了i-1件物品,背包容量为j-w[i]时的最大价值,也是相当于为第i件物品腾出了w[i]的空间。

如果不拿,m[i][j]=m[i-1][j]

由此可以得到状态转移方程:

if(j>=w[i])
    m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i]);
else
    m[i][j]=m[i-1][j];

本题代码:

#include<stdio.h>

void caiyao();

void kaicai(int *value,int *time,int M,int T);

int sumvalue[102][1001];

#define  max(x,y) (x)>(y)?(x):(y)

int main()

{

 caiyao();

 return 0;

}

void caiyao()

{

int T,M;

int value[100],time[100];

while(scanf("%d%d",&T,&M)!=EOF)

{

  for(int i=1;i<=M;i++)

  scanf("%d%d",&time[i],&value[i]);

 

  kaicai(value,time,M,T);

}

return ;

}

void kaicai(int *value,int *time,int M,int T)

{

   int m,t;

   for(m=1;m<=M;m++)

   {

     for(t=1;t<=T;t++)

      {

       if(time[m]<=t)

       sumvalue[m][t]=max(sumvalue[m-1][t-time[m]]+value[m],sumvalue[m-1][t]);

       else

       sumvalue[m][t]=sumvalue[m-1][t];

      }

   }

    printf("%d\n",sumvalue[M][T]);

}
点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论