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 }

 

posted on 2015-04-12 11:22  JASONlee3  阅读(240)  评论(0编辑  收藏  举报

导航