• 背包问题求最优解方案数


    有 NN 件物品和一个容量是 VV 的背包。每件物品只能使用一次。

    第 ii 件物品的体积是 vivi,价值是 wiwi。

    求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

    输出 最优选法的方案数。注意答案可能很大,请输出答案模 109+7109+7 的结果。

    输入格式

    第一行两个整数,N,VN,V,用空格隔开,分别表示物品数量和背包容积。

    接下来有 NN 行,每行两个整数 vi,wivi,wi,用空格隔开,分别表示第 ii 件物品的体积和价值。

    输出格式

    输出一个整数,表示 方案数 模 109+7109+7 的结果。

    数据范围

    0 0

    输入样例

    1. 4 5
    2. 1 2
    3. 2 4
    4. 3 4
    5. 4 6

    输出样例:

    2

     思路:

    求最优方案的方案数就可以类比最短路问题,相当于求最短路的条数

    再开一个数组g[] ,保存那个方案对应的最大方案数

    g[] 数组更新方式为,它可以跟不选 i 一样大,也可能跟选 i 一样大,还可能同时一样大

    有三种情况

    所以注意更新方式

    代码:

    1. #include
    2. using namespace std;
    3. const int N = 1010,mod = 1e9+7;
    4. int n, m;
    5. int f[N],g[N];
    6. int main()
    7. {
    8. cin >> n >> m;
    9. memset(f, -0x3f, sizeof f);
    10. f[0] = 0;
    11. g[0] = 1;
    12. for (int i = 0; i < n; i++) {
    13. int v, w;
    14. cin >> v >> w;
    15. for (int j = m; j >= v; j--) {
    16. int maxv = max(f[j], f[j - v] + w);
    17. int s = 0;
    18. if (maxv == f[j])s = g[j];
    19. if (maxv == f[j - v] + w)s = (s + g[j - v])%mod;
    20. f[j] = maxv, g[j] = s;
    21. }
    22. }
    23. int res = 0;
    24. for (int i = 0; i <= m; i++) {
    25. if (f[i] > f[res])res = i;
    26. }
    27. int sum = 0;
    28. for (int i = 0; i <= m; i++) {
    29. if (f[i] == f[res])sum = (sum + g[i]) % mod;
    30. }
    31. cout << sum;
    32. return 0;
    33. }

  • 相关阅读:
    GridSearchCV 工具介绍
    CentOS7安装VMware Tools
    NSSCTF web 刷题记录2
    【学习笔记67】JavaScript中的闭包
    GoF之代理模式
    Leetcode338. 比特位计数
    山西电力市场日前价格预测【2023-10-12】
    图像识别-人脸识别与疲劳检测 - python opencv 计算机竞赛
    [LeetCode 1373]二叉搜索子树的最大键值和
    JS创建一个数组(字面量)
  • 原文地址:https://blog.csdn.net/qq_59183443/article/details/128167418