AC_7混合背包问题
Posted gcter
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AC_7混合背包问题相关的知识,希望对你有一定的参考价值。
代码:
/*混合背包问题*/ /* */ #include<iostream> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int N = 1010; int f[N]; int n, m; struct Thing int kind; int v, w; ; vector<Thing>things; int main() cin >> n >> m; for (int i = 0; i < n; i++) int v, w, s; cin >> v >> w >> s; if (s < 0) things.push_back( -1, v, w ); else if (s == 0) things.push_back( 0, v, w ); else for (int k = 1; k <= s; k *= 2)//分离 每一部分都是01背包问题 s -= k; things.push_back( -1, v*k, w*k ); if (s>0) things.push_back( -1, v*s, w*s ); for (auto thing : things) if (thing.kind < 0)//01背包 for (int j = m; j >= thing.v; j--) f[j] = max(f[j], f[j - thing.v] + thing.w); else for (int j = thing.v; j <= m; j++)//完全背包 f[j] = max(f[j], f[j - thing.v] + thing.w); cout << f[m] << endl; return 0; /*
以上是关于AC_7混合背包问题的主要内容,如果未能解决你的问题,请参考以下文章