Day26 洛谷真题讲解(递推)(背包问题)
下面两道背包问题,如果整明白了那就是相当不错了
#include<iostream>
using namespace std;
int arr[30] = { 1,1,2 };
int main()
{
int n;
cin >> n;
for (int i = 3; i <=n; i++)
{
for (int k = 1; k <= i; k++)
{
arr[i] += arr[k - 1] * arr[i - k];
}
}
cout << arr[n];
}
背包问题
#include<iostream>
#include<algorithm>
using namespace std;
int timee[101];
int value[101];
int dp[101][1010];
int main()
{
int t, m;
cin >> t >> m;
for (int i = 0; i < m; i++) // 修正:读取 m 个物品
{
cin >> timee[i] >> value[i];
}
for (int i = 1; i <= m; i++) // 修正:从 1 开始循环
{
for (int j = 0; j <= t; j++)
{
if (timee[i-1] > j) // 修正:使用 i-1 索引
{
dp[i][j] = dp[i-1][j];
}
else
{
dp[i][j] = max(dp[i-1][j], dp[i-1][j - timee[i-1]] + value[i-1]); // 修正:使用 i-1 索引
}
}
}
cout << dp[m][t]; // 修正:输出 dp[m][t]
}
看好上面的for循环有两个地方是从i=1开始的
#include<iostream>
int num[50];
int dp[50][25000];
using namespace std;
int main()
{
int v, n;
cin >> v >> n;
for (int i = 1; i <= n; i++)
{
cin >> num[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= v; j++)
{
if (num[i] > j)
{
dp[i][j] = dp[i - 1][j];
}
else
{
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - num[i]] + num[i]);
}
}
}
cout <<v- dp[n][v];
}