输入第一行有两个整数T (1<=T<=1000)和N (1<=N<=100),用一个空格隔开,T代表总共能够用来采药的时间,N代表山洞里的草药的数目。接下来的N行每行包括一个字符串和两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的药名、草药的时间和草药的价值。 输出描述: 输出包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。 输入样例: 70 3 天麻 71 100 金银花 69 1 何首乌 1 2 输出样例: 3 。用c语言编写代码
时间: 2024-03-08 08:47:27 浏览: 212
我们第一行包括两个整数n,k(1<=n<=100,k<=6e5),表示有n个数字,目标和为k 第二行输入n个整数(c1 c2
```c
#include <stdio.h>
#include <string.h>
#define MAX_N 100
#define MAX_T 1000
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int T, N;
int dp[MAX_N + 1][MAX_T + 1]; // 定义 dp 数组
char name[101]; // 草药的名称
int time, value; // 草药的采摘时间和价值
// 读入 T 和 N
scanf("%d%d", &T, &N);
// 初始化 dp 数组
memset(dp, 0, sizeof(dp));
// 读入每一种草药的信息
for (int i = 1; i <= N; i++) {
scanf("%s%d%d", name, &time, &value);
for (int j = 1; j <= T; j++) {
if (j < time) { // 时间不够,不能采摘
dp[i][j] = dp[i - 1][j];
} else { // 时间够,可以选择采摘或不采摘
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - time] + value);
}
}
}
// 输出结果
printf("%d\n", dp[N][T]);
return 0;
}
```
注意事项:
1. 在进行状态转移时,需要分时间够和时间不够两种情况进行讨论;
2. 在进行状态转移时需要使用 max 函数计算两种情况下的最大值;
3. 在读入草药信息时,需要使用字符串类型的变量来存储草药的名称。
阅读全文