洛谷p1776宝物筛选

宝物筛选

多重背包问题

物品数目已知

可以枚举每个物品

当做01背包来做

不过会超时

此时需要二进制拆分来优化

分解成新的物品

再跑一遍01背包即可

//二进制拆分+01背包
//设f[j]表示前i件物品花费恰好为j的最大价值 
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 1000000;
int n, m, f[N], v[N], w[N], cnt, a, b, c;
int read() {
    int s = 0, w = 1;
    char ch = getchar();
    while(!isdigit(ch)) {if(ch == '-') w = -1; ch = getchar();}
    while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = getchar();}
    return s * w;
}
int main() {
    n = read(), m = read();
    for(int i = 1; i <= n; i++) {
        a = read(), b = read(), c = read();
        for(int j = 1; j <= c; j <<= 1) {
            v[++cnt] = a * j;
            w[cnt] = b * j;
            c -= j;
        }
        if(c) v[++cnt] = a * c, w[cnt] = b * c;
    }
    for(int i = 1; i <= cnt; i++)
        for(int j = m; j >= w[i]; j--)
            f[j] = max(f[j], f[j - w[i]] + v[i]);
    printf("%d\n", f[m]);
    return 0;
} 

谢谢收看, 祝身体健康!

 

全部评论

相关推荐

Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务