求助站外题
  • 板块灌水区
  • 楼主Esawkm
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/3/18 21:27
  • 上次更新2023/10/28 06:17:31
查看原帖
求助站外题
642481
Esawkm楼主2022/3/18 21:27

设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为m,今从n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于m,而价值的和为最大。

输入 第1行:两个整数,m(背包容量,m<=200)和n(物品数量,n<=30);

第2至n+1行:每行两个整数Wi,Ci,表示每个物品的重量和价值。

输出 仅一行,一个数,表示最大总价值。

样例 样例输入1 10 4 2 1 3 3 4 5 7 9 样例输出1 max=12

#include<bits/stdc++.h>
using namespace std;
int weight[50 + 1];
int value[50 + 1];
int num[20 + 1];
int f[1000 + 1];
int max(int a, int b) {
    return a > b ? a : b;
}
int main() {
    int n, m;
    cin >> n;cin >> m;
    for (int i = 1; i <= n; i++) {
        cin >> weight[i] >> value[i] >> num[i];
    }
    int k = n + 1;
    for (int i = 1; i <= n; i++) {
        while (num[i] != 1) {
            weight[k] = weight[i];
            value[k] = value[i];
            k++;
            num[i]--;
        }
    }
    
    for (int i = 1; i <= k; i++) {
        for (int j = m; j >= 1; j--) {
            if (weight[i] <= j) f[j] = max(f[j], f[j - weight[i]] + value[i]);
        }
    }
    cout <<"max="<< f[m] << endl;
}

为什么不对

2022/3/18 21:27
加载中...