洛谷P1048 采药【01背包】

输入 #1
70 3
71 100
69 1
1 2
输出 #1
3
思路:经典01背包问题,用了二维以及优化的一维两种方法来写,关键是其状态方程。
二维:
#include<bits/stdc++.h>
using namespace std;
int dp[105][1005];
int w[105], v[105];
int main() {
int t, m; cin >> t >> m;
for (int i = 1; i <= m; ++i)cin >> w[i] >> v[i];
for (int i = 1; i <= m; ++i)
for (int j = 1; j <= t; ++j)
if (j < w[i])
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
cout << dp[m][t] << endl;
}
一维
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int dp[1005];
int w[105], v[105];
int main(){
int t, m;
scanf("%d %d", &t, &m);
for (int i = 1; i <= m; ++i)
scanf("%d %d", &w[i], &v[i]);
for (int i = 1; i <= m; ++i)
for (int j = t; j >= w[i]; --j)
dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
cout << dp[t] << endl;
return 0;
}
不是世界变得无聊了,而是你变得无聊了。

浙公网安备 33010602011771号