HDOJ 5410 01背包+完全背包

来源:互联网 发布:怕死 陈奕迅 知乎 编辑:程序博客网 时间:2024/05/01 04:36

题目大意:给定背包容量m,物品种类n,每种物品的重量w[i],还有卖的数量x对应的价值a[i]*x+b[i],求最大的价值。

思路:01背包选好第一个物品,即确定价值量a[i]+b[i],然后完全背包走一遍,每次价值加a[i].

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <map>#include <set>#include <vector>#include <stack>#include <queue>#include <algorithm>#include <cmath>#define LL long long#define INF 0x3f3f3f3f#define MOD 1000000007#define maxn 2024#define Pair pair<int, int>#define mem(a, b) memset(a, b, sizeof(a))using namespace std;int dp[maxn];int w[maxn], a[maxn], b[maxn];int n, m;int main(){    int T;    scanf("%d", &T);    while (T--) {        scanf("%d%d", &m, &n);        for (int i = 1; i <= n; ++i) {            scanf("%d%d%d", &w[i], &a[i], &b[i]);        }        mem(dp, 0);        for (int i = 1; i <= n; ++i) {            for (int j = m; j >= w[i]; --j) {                dp[j] = max(dp[j - w[i]] + a[i] + b[i], dp[j]);            }            for (int j = w[i]; j <= m; ++j) {                dp[j] = max(dp[j], dp[j - w[i]] + a[i]);            }        }        printf("%d\n", dp[m]);    }    return 0;}


0 0
原创粉丝点击