洛谷 P1048 [NOIP2005 普及组] 采药题解

 dp[i][j],i表示物品,j表示总时间,也可以理解为背包的最大容量。

那么就有两种情况了,就是选和不选。

选就是dp[i - 1][j - t[i]] + v[i],不选就是dp[i - 1][j]。就是01背包问题

#include
using namespace std;
using ll = long long;
ll T, M;
ll dp[105][1010];
ll t[105], v[105];

void solve()
{
	for (int i = 1; i <= M; ++i)cin >> t[i] >> v[i];
	for (int i = 1; i <= M; ++i)
	{
		for (int j = 0; j <= T; ++j)//从前往后还是从后往前都没有影响
		{
			if (j >= t[i])dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - t[i]] + v[i]);
			else dp[i][j] = dp[i - 1][j];//时间不够就不需要减掉花费的时间
		}
	}
	cout << dp[M][T] << '\n';
}

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	while (cin >> T >> M)
	{
		if (T == 0 && M == 0) break;
		solve();
	}
	return 0;
}

你可能感兴趣的:(c++,算法)