动态规划之背包问题

/*在一固定容积为C的背包内装入N件物品,
物品的体积为:w1,w2,-----wn;
价值为:v1,v2,------vn;
求能装物品的最大价值。*/
这类问题的决策是:第N件物品放或者不放;   
 由此可以写出动态转移方程:
  我们用n[i,j]表示在前 i 件物品中选择若干件放在所剩空间为 j 的背包里所能获得的最大价值
  n[i][j]=max{n[i-1][j-Wi]+v[i] , f[i-1,j]} 注(j>=Wi);
  这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为c的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为c的背包中”,价值为v[i];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为c-w[i]的背包中”,此时能获得的最大价值就是n[c-w[i]]再加上通过放入第i件物品获得的价值v[i]。

#include<stdio.h>
int n[10000][10000];
int main()
{
int T,N,w[10000],v[10000],c,c1,i,j;
scanf("%d",&T);
while(T--)
{
printf("请输入物品个数:");
scanf("%d",&N);
printf("请输入每个物品的重量和价值:\n");
for(i=1;i<=N;i++)
scanf("%d%d",&w[i],&v[i]);
printf("请输入背包容积:");
scanf("%d",&c);

for(i=0;i<=c;i++)
n[0][i]=0;
for(j=0;j<=c;j++)
{
for(i=1;i<=N;i++)
{
if(j==0)
n[i][j]=0;
if(w[i]>j)
{
if(i==1)
n[i][j]=0;
else
n[i][j]=n[i-1][j];
}
else
{
if(i==1)
n[i][j]=v[i];
else
{
c1=j-w[i];
n[i][j]=n[i-1][j]>(v[i]+n[i-1][c1])?(n[i-1][j]):(v[i]+n[i-1][c1]);
}
}
}
}
printf("%d\n",n[N][c]);
}
return 0;
}

你可能感兴趣的:(动态规划)