确实,很水的dp,01背包嘛。
初学,还是写错啦。
两种方法,二维dp和一维dp。
一维dp
#include <iostream>
using namespace std;
int t, m;
int w[105], v[105];
int dp[1005];
int main(){
scanf("%d%d", &t, &m);
dp[0] = 0;
for(int i = 0; i < m; i ++){
scanf("%d%d", &w[i], &v[i]);
}
for(int i = 0; i < m; i ++){
for(int j = t; j >= 1; j --){
if(w[i] <= j){
dp[j] = max(dp[j], dp[j-w[i]]+v[i]);
}
}
}
printf("%d\n", dp[t]);
return 0;
}
二维dp
int t, m;
int w[105], v[105];
int dp[105][1005];
int main(){
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 = 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]);
}
}
}
printf("%d\n", dp[m][t]);
return 0;
}
二维dp没啥好说的,状态转移式dp[i][j]=max(dp[i-1][j], dp[i-1][j-w[i]]+v[i])
,一维dp看了别人的题解,内层循环要倒着写(从t到1),因为如果正着写,用的就是更新过后的dp[j-w[i]]
了。
要坚强要加油哦!