L国即将与I国发动战争!!
俗话说的好:“知己知彼,百战不殆”。L国的指挥官想派出间谍前往I国,于是,选人工作就落到了你身上。
你现在有N个人选,每个人都有这样一些数据:A(能得到多少资料)、B(伪装能力有多差)、C(要多少工资)。已知敌人的探查间谍能力为M(即去的所有人B的和要小于等于M)和手头有X元钱,请问能拿到多少资料?
N M X
A1 B1 C1
A2 B2 C2
………………
AN BN CN
能得到的资料总数
3 10 12
10 1 11
1 9 1
7 10 12
11
1≤n≤100,1≤m≤1000, 1≤x≤1000
背包有两个容量(把其中一个容量看成背包可以承受的最大重量更好理解),
题目转化为:
背包有一个最大容量,和一个可以承受的最大重量,N个物品,每个给出其体积和重量以及价值,怎么装使得总价值最大?
dp[j][k]表示容量为j,重量不超过k的背包可以装到的最大价值,
枚举每个物品,嵌套循环容量j和重量k,决定这个物品选还是不选就可以啦。
代码中把每个物品的容量和重量用二维数组存储。
#include "stdio.h"
#include "stdlib.h"
#ifndef max
#define max(a, b) ((a) > (b) ? (a) : (b))
#endif
int value[100];
int weight[2][100];
int dp[1001][1001];
int main() {
int n, m, x;
scanf("%d %d %d", &n, &m, &x);
for (int i = 0; i < n; i++)
scanf("%d %d %d", value + i, weight[0] + i, weight[1] + i);
for (int i = 0; i < n; i++)
for (int j = m; j >= weight[0][i]; j--)
for (int k = x; k >= weight[1][i]; k--) {
dp[j][k] = max(dp[j][k], dp[j - weight[0][i]][k - weight[1][i]] + value[i]);
if (i == n - 1) break;
}
printf("%d", dp[m][x]);
return 0;
}