动态规划--01背包

核心思想:

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。

思路:

最大价值是物品数量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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值