经典0-1背包基础注释

来源:互联网 发布:sql server服务器ip 编辑:程序博客网 时间:2024/06/14 09:22

背包问题;

给一个背包的容纳量,给出一堆东西的价值和重量,要求在最大重量的情况下求出最大价值;

将该问题一步步细分,假如背包只有1的容纳量,装这些东西,每个东西都有两种状态,装还是不装,比较在装这个还是不装这的情况下两种价值,找出最大价值;


#include<stdio.h>int main(){int a[5]={2,2,6,5,4};                                   //   a为重量,,,,b为价值int i1,i2,b[5]={6,3,5,4,6},s,k[5][11]={0},t;          //多一组0背包 用于装剩余背包与该数的重量相同for(i1=1;i1<=10;i1++){if(i1>=a[4])                         //判断最后一排的数如果小于背包就加上该价值{k[4][i1]=b[4];}for(i2=3;i2>=0;i2--)                //倒数第二排开始往上以此判断{if((i1-a[i2])>=0)                //如果该数小于背包,能装进背包{if((k[i2+1][i1-a[i2]]+b[i2])>=k[i2+1][i1])   //就从背包减去该重量中剩余的背包重量中找最优解;如果最优解加上该数代表的价值大于上一个数;{k[i2][i1]=(k[i2+1][i1-a[i2]]+b[i2]);      //该数就是该背包的最优解,保证二维表看k[i][j]中的第一排表示在j的重量下的最大价值;}else                                      //如果小于上一个数{k[i2][i1]=k[i2+1][i1];   //不能加则上一个数仍为最优解}}else                              //如果该数的重量大于背包;{k[i2][i1]=k[i2+1][i1];   //不能加则上一个数仍为最优解}}}t=k[0][0];for(i1=0;i1<5;i1++){for(i2=0;i2<=10;i2++){printf("%d  ",k[i1][i2]);if(k[i1][i2]>=t){t=k[i1][i2];}}printf("\n");}printf("%d",k[0][10]);return 0;}


0 0
原创粉丝点击