动态规划解决0-1背包问题

动态规划:求解一个问题的最优解,如果这个问题可以不断地分解成子问题并且这个问题的最优解包含子问题的最优解那么久可以用动态规划来解决。把所有子问题的最优解储存下来。

0-1背包:设背包容量大小C,放进去第i件物品,其重量为w,价值v。如果w>C,那么此时最优解为不放进物品i是的最优解,反之,此时最优解为不放进物品i的最优解或者是放入物品i。放入物品i时此时最优解为不放入物品i且背包容量大小为C-w时的最优解再加上物品i。

代码:

#include<iostream>

using namespace std;

int v[200][200];

int max(int a, int b)
{
    if(a>b)
        return a;
    return b;
}

int knap(int i, int W, int*v, int *w )                     //决定放不放物品i,背包容量为w
{
    if(w[i]>W)
    {
        return knap(i-1, W, v, w);
    }
    if(i>0)
    {
    return max(knap(i-1, W, v, w), knap(i-1, W-w[i-1], v, w)+v[i-1]);
    }
    else
    {
        return 0;
    }

}

int main()
{
    int w[4]={2, 1, 3, 2};                   //重量
    int v[4]={12, 10, 20, 15};                   //价值
    int s;
    int C=5;

    cout << knap(4, 5, v, w);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值