01背包
有n个物品,每个物品的重量为weight[i],每个物品的价值为value[i]。现在有一个背包,它所能容纳的重量为total,问:当你面对这么多有价值的物品时,你的背包所能带走的最大价值是多少?
题解:关键在于状态方程。
代码:
1 #include<stdio.h> 2 #define MAX 1000 3 int max(int a,int b) 4 { 5 return a>b?a:b; 6 } 7 int main() 8 { 9 int n,m,w[MAX],v[MAX],i,j,dp[MAX]; 10 printf("背包容量:"); 11 scanf("%d",&m); 12 printf("物品个数:"); 13 scanf("%d",&n); 14 printf("每个物品的重量和价值:\n"); 15 for(i=1;i<=n;i++) 16 scanf("%d%d",&w[i],&v[i]); 17 for(i=1;i<=n;i++) 18 for(j=m;j>=w[i];j--) 19 dp[j]=max(dp[j],v[i]+dp[j-w[i]]); //dp[j]表示重量为j的背包中所装物品的最大价值(dp数组元素的值表示价值,下标j表示重量) 20 printf("最大价值为:%d\n",dp[m]); 21 return 0; 22 }