背包问题;
给一个背包的容纳量,给出一堆东西的价值和重量,要求在最大重量的情况下求出最大价值;
将该问题一步步细分,假如背包只有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;
}