/**运用动态规划法计算背包问题
/**自底向上的方式计算最优解的值
int **KnapsackDP(int n,int W,int * Weights,float *Valus){
int i,w;
/**为二维数组申请空间**/
int **c=(int **)malloc(sizeof(int *)*(n+1));
for(i=0;i<=n;i++)
c[i]=(int *)malloc(sizeof(int *)(W+1));
/**初始化二维数组 c数组的目的是为了构造最优解**/
for(w=0;w<=W;w++)
c[0][w]=0;
for(i=1;i<=n;i++)
c[i][0]=0;
for(w=1;w<=W;w++){
/**如果背包剩余重量大于物品重量 第i-1个放入物品的重量
if(Weights[i-1]<=w){
if(Values[i-1]<=w){
if(Value[i-1]+c[i-1][w-Weight[i-1]]>c[i-1][w]
{
c[i][w]=Values[i-1]+c[i-1][w-Weights[i-1]];
}
else{
c[i][w]=c[i-1][w];
}
}
return c;
}
/**在上面计算出了最优解的值基础上 对问题构造出最优解
void OutputKnapsackDP(int n,int W,int *Weights,float*Values,int **c){
int x[n];
int i;
for(i=n;i>1;i--){
if(c[i][W]==c[i-1][W])/**重量为W的最优选择的背包中不包含该物品
x[i-1]=0;
else{
x[i-1]=1;
W=W-Weights[i-1];/**更新背包目前的最大容量
}
}
if(c[1][W]==0)
x[0]=0;
else
x[0]=1;
for(i=0;i<n;i++)
if(x[i]==1)
printf("Weight:%d,Value:%f\n",Weights[i],Values[i]);
}