01背包问题C
2017-04-17 20:15
288 查看
有5个物品,编号1-5,背包的总承重为10,重量分别是【2,2,6,5,4】,价值分别是【6,3,5,4,6】。结果:最大价值15。
1,如果装入第i个物品时,它的重量大于背包的剩余容量,则装人前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,因为物品i不能装入背包,2,如果装入第i个物品时,它重量小于背包的剩余容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量为j-wi 的背包中的价值加上第i个物品的价值vi; (b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。
1,如果装入第i个物品时,它的重量大于背包的剩余容量,则装人前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,因为物品i不能装入背包,2,如果装入第i个物品时,它重量小于背包的剩余容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量为j-wi 的背包中的价值加上第i个物品的价值vi; (b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。
#include<stdio.h> int v2[100][100]={}; int x[50]={};// int mymax(int x,int y) { if(x>y) return x; else return y; } int backpack(int n,int *w,int *v,int *x,int c) { int i,j; for(i=1;i<=n;++i) { for(j=1;j<=c;++j) { if(w[i]>j) v2[i][j]=v2[i-1][j]; else v2[i][j]=mymax(v2[i-1][j-w[i]]+v[i],v2[i-1][j]); } } j=c; i=n; for(;i>0;--i)//从后往前推。。。 { if(v2[i][j]>v2[i-1][j])//如果装入第i个物体总价值比不装这个物体总价值大 { x[i]=1;//选上 j=j-w[i];//把第i个物体从背包丢出去 } else x[i]=0; } for(int i=1;i<=n;++i) { printf("%d ",w[i]); } printf("\n"); for(int i=1;i<=n;++i) { printf("%d ",v[i]); } printf("\n"); for(int i=1;i<=n;++i) { printf("%d ",x[i]); } return v2 [c]; } int main() { int n; scanf("%d",&n); int w[50]; int v[50]; int c; scanf("%d",&c); for(int i=1; i<=n; ++i) scanf("%d%d",&w[i],&v[i]); int s=backpack(n,w,v,x,c); printf("%d\n",s); return 0; }