动态规划-完全背包(1)

01背包说白了就是一个物品放还是不放的问题,然后一个一个往下推下去,这种决策使得问题变得更加的简单便捷。

和01背包相同的还有完全背包,所谓的完全背包,就是01背包的物品不限制个数,可以放置任意件。

完全背包题目的做法跟01背包是相同的,只是多了一个数量的问题。

使用我们oj上的采药,这次是采药2

我们继续列上次那样的表,草药编号1~5,背包是m的重量。重量从0开始,一直是增加的,只要增加量不超过背包的总重量即可。

1.第一株草药,重77,价值92,0到76为0,77到100为92

2.第二株草药,重33,价值50,0到32为0,33到65为50,66到98为100,99和100为150

这样的话,每一株草药是否采摘还是和上一株草药的数值有关。

设价值是c[n][m],草药的重量w[n],价值v[n]。

可以找出表达式:

c[n][m] = max(c[n-1][m], c[n-1][m-w[n]*k]+v[n]*k)    k是m/w所得出的结果

根据上面的表达式可以写出这个题的代码,直接贴上

<span style="font-size:18px;">#include <stdio.h>
#define max(a,b) a>b?a:b

int main(){
    int c[1001] = {0};
    int w[1000], v[1000];
    int m, n, i, j, l, k;
    scanf("%d %d", &m, &n);
    for(i=0; i<n; i++){
        scanf("%d %d", &w[i], &v[i]);
    }
    for(j=0; j<n; j++){
        for(l=0; l<=m; l++)
            if(l >= w[j])
                c[l] = max(c[l], c[l-w[j]]+v[j]);
    }
    printf("%d\n", c[m]);
    return 0;
}
</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值