核心思想:
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。
思路:
最大价值是物品数量i和背包容量j的函数。
设函数f[i][j]表示前i件物品放入容量为j的背包的最大价值。
最终的最大价值就是物品数量i从0增长到n,背包容量j从0增长到m时的f[n][m]值
代码:
#include<stdio.h>
int max(int n1,int n2)
{
if(n1>n2)
return n1;
else
return n2;
}
int main()
{
int w,c;
scanf("%d %d",&w,&c);
int value[]={0,1,4,5,7};
int weight[]={0,1,3,4,5};
int dp[w+1][c+1];
int i,j;
for(i=0;i<=w;i++)
{
for(j=0;j<=c;j++)
{
dp[i][j]=0;
}
}
for(i=1;i<=w;i++)
{
for(j=1;j<=c;j++)
{
if(j>=weight[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);
else
dp[i][j]=dp[i-1][j];
}
}
printf("%d",dp[w][c]);
return 0;
}