首页 > 代码库 > 51nod 1086 背包问题 V2(二进制优化多重背包)
51nod 1086 背包问题 V2(二进制优化多重背包)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1086
题解:怎么用二进制优化多重背包,举一个例子就明白了。
如果要放n个苹果,可以将n个苹果分成几个2的次方1,2,3,4,m^2然后n可以由这些按照某种组合来组合。
于是就知道怎么优化了。
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int M = 1e5 + 10;int wi[110] , p[110] , c[110] , dp[M];int main() { int n , w; scanf("%d%d" , &n , &w); for(int i = 1 ; i <= n ; i++) { scanf("%d%d%d" , &wi[i] , &p[i] , &c[i]); } memset(dp , 0 , sizeof(dp)); for(int i = 1 ; i <= n ; i++) { int d1 = 1 , d2 = c[i]; while(d1 < d2) { for(int j = w ; j >= d1 * wi[i] ; j--) { dp[j] = max(dp[j] , dp[j - d1 * wi[i]] + d1 * p[i]); } d2 -= d1; d1 *= 2; } for(int j = w ; j >= d2 * wi[i] ; j--) { dp[j] = max(dp[j] , dp[j - d2 * wi[i]] + d2 * p[i]); } } printf("%d\n" , dp[w]); return 0;}
51nod 1086 背包问题 V2(二进制优化多重背包)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。