此题就是完全的01背包问题,转化为求最优解的动态规划。
#include <stdio.h>
int max(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
int main()
{
int t, n, time[100], v[100];
scanf("%d%d", &t, &n);
for (int i = 0; i < n; i++)
{
scanf("%d%d", &time[i], &v[i]);
}
int dp[100][1000];//dp[前i个最优解][时间]
for (int j = 1; j <= t; j++)//j:时间
{
for (int i = 0; i < n; i++)//i;药材数组的角标
{
if (time[i] > j)
{
if (i == 0)
{
dp[i][j] = 0;
//第一个时间不够,则前1个的最优解为0
}
else
{
dp[i][j] = dp[i - 1][j];
//第i个时间不够,则转化为前i-1个求最优解的问题
}
}
else
{
if (i == 0)
{
dp[i][j] = v[i];
//第1个时间够,则前1个最优解为v[1]
}
else
{
dp[i][j] = max(dp[i - 1][j - time[i]] + v[i], dp[i - 1][j]);
//若选择第i个,最优解是它自己的价值加上前i-1个,时间为j - time[i]时的最优解
//若不选,则是前i-1个,时间不变(为j)的最优解
//两种情况取最大值即为前i个时间为j的最优解
}
}
}
}
printf("%d", dp[n - 1][t]);
}
如有错误请多多指正!