AC_5。複数のナップザック問題II

コード:

// 複数の最適化バックパック(バイナリ)
/ * 
複数ナップサック問題を変換する方法1.ナップザック問題は、01 
回だけ物品あたり、内部繰り返し配列に部品を分解V、W S 

=>バイナリ分割方法
77このような範囲内から選択することができるどのように多くのすべての数字の数が外に組み合わせることができることを7 0-7 
1 1 1 1 1 1 1 

1 2 4 
0 
1 
2 
3 = 1 + 2 
4 4 = 
5 = 4 + 1 
6 = 4 + 2 
7 = 1 + 2 + 4 

数Sが与えられると、数ははるかに回答のLOG2 s以下(S)の全ての数の丸め方法を表してもよい
、S 10 = 
1 3 2 4 
1 2 7:0-7 
。3:0 -10 

S - 1 - 2 - 4 - 8ログ(S)部分に
1000年*ログ(2000)= 1000 * 11 * 2000 * 2000 = 2 ^ 10 7 *。
* / 
の#include <iostreamの> 
する#include <CStringの> 
書式#include <アルゴリズム> 
書式#include <ベクトル>
 使用 namespace std;
const int NUM = 2010;
int N, V;
int dp[NUM];
//定义结构体 v体积,w表示价格
struct Good{
    int v, w;
};
int main()
{
    vector<Good>goods;//不知道总共的物品有多少个
    cin >> N >> V;
    for (int i = 0; i < N; i++)
    {
        int v, w, n;
        cin >> v >> w >> n;
        for (int k = 1; k <= n; k *= 2)//拆成2的整次幂
        {
            n -= k;
            goods.push_back({ v*k, w*k });//放到物品组中去
        }
        if (n>0)
            goods.push_back({ v*n, w*n });//剩余的
    }
    // 01背包求最大价值
    for (auto good:goods)
        for (int j = V; j >= good.v; j--)
        {
            dp[j] = max(dp[j], dp[j - good.v] + good.w);
        }
    cout << dp[V] << endl;
    return 0;
}

 

おすすめ

転載: www.cnblogs.com/gcter/p/11223291.html