C++ 基于动态规划的多可用包背包问题

C++ 基于动态规划的多可用包背包问题,c++,algorithm,dynamic-programming,graph-algorithm,knapsack-problem,C++,Algorithm,Dynamic Programming,Graph Algorithm,Knapsack Problem,你好,谢谢你的帮助 因此,我们有一个烟花列表,其中包含1)库存数量2)此包装中的烟花数量3)直径等于噪音和 4) 价格 以下是列表: 25171021 1015108 5161019 10151220 15 9 11 12 1072823 871611 1066110 25101825 25121827 1054035 60 40 5 27 525300 501608 我们的任务是创建一个购物清单并购买烟花爆竹,这样我们就能获得尽可能高的噪音。我们有1000欧元的背包容量。我们也应该在不使用表的

你好,谢谢你的帮助
因此,我们有一个烟花列表,其中包含
1)库存数量
2)此包装中的烟花数量
3)直径等于噪音和
4) 价格

以下是列表:
25171021
1015108
5161019
10151220
15 9 11 12
1072823
871611
1066110
25101825
25121827
1054035
60 40 5 27
525300
501608

我们的任务是创建一个购物清单并购买烟花爆竹,这样我们就能获得尽可能高的噪音。我们有1000欧元的背包容量。我们也应该在不使用表的情况下解决这个问题(因此使用动态规划)

我只使用一个名为Package的类,它包含如上所示的四个约束

起初,我认为尝试为一个普通的背包编写一个算法是有意义的,所以只考虑价格和直径(=重量)。我用一个不同的列表测试了它,它工作得非常好。我只是迭代了所有包,然后再次使用嵌套for循环来查找最佳星座(穷举搜索)。我的下一个想法是将每包烟花的数量与直径合并,因为烟花只能整包购买

剩下的唯一一件事我还没有弄清楚,那就是如何处理库存中的包裹数量。比如,在我目前的算法中,它只购买所有的烟火包,直到背包装满为止。但显然这是不对的

void knapsack(vector<Package*> stock){
    vector<int> indices, tmp_indices;
    int noise,tmp_noise= 0;
    int price;

    for (unsigned int i = 0; i < stock.size(); i++) {

        price = stock[i]->price;
        noise = stock[i]->diameter*stock[i]->number_fireworks; 

        indices.push_back(i);

        for (unsigned int j = 0; j < stock.size(); j++) {
            if (i != j) {

                if (price+stock[j]->price<= BUDGET) {
                    price+=stock[j]->price;
                    noise+=stock[j]->diameter*stock[j]->number_fireworks;
                    indices.push_back(j);
                }
            }

        }

        // After second loop we have a new possible constellation
        // Check if the previous constellation had a lower value and if so, set it to the current one

        if (noise > tmp_noise) {
            tmp_noise = noise;
            tmp_indices.clear();

            // tmp save
            for (auto &index : indices) {
                tmp_indices.push_back(index); 
            }

        }
        price= 0;
        noise = 0;
        indices.clear();

    }


    // Best constellation found, Print the shopping list
    cout << "\Stock.\tNum\Diameter.\Price\n" << endl;
    for(unsigned int i = 0; i < tmp_indices.size(); i++) {

        cout << stock[tmp_indices[i]]->stock<< "\t";
        cout << stock[tmp_indices[i]]->number_fireworks<< "\t";
        cout << stock[tmp_indices[i]]->diameter<< "\t";
        cout << stock[tmp_indices[i]]->price<< "\t\n";
    }

 }
void背包(矢量股票){
向量指数,tmp_指数;
int噪声,tmp_噪声=0;
国际价格;
for(无符号整数i=0;i价格;
噪声=存量[i]->直径*存量[i]->数量;
指数。推回(i);
对于(无符号整数j=0;jpriceprice;
噪声+=存量[j]->直径*存量[j]->数量;
指数。推回(j);
}
}
}
//在第二圈之后,我们有了一个新的可能的星座
//检查前一个星座是否具有较低的值,如果是,则将其设置为当前星座
中频(噪声>tmp_噪声){
tmp_噪声=噪声;
tmp_索引。清除();
//tmp保存
用于(自动索引和索引:索引){
tmp_指数。向后推(指数);
}
}
价格=0;
噪声=0;
索引。清除();
}
//找到的最佳星座,打印购物清单
库特