一开始是这样写的,提交只拿了60:
#include<iostream>
#include<vector>
using namespace std;
int main(){
int V, n;
cin >> V;
cin >> n;
vector<int> a(n + 1, 0);
vector<vector<int>> dp(n + 1, vector<int>(V + 1, 0));
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= n; i ++)
for(int j = V; j >= a[i]; j --)
dp[i][j] = max(dp[i-1][j], dp[i-1][j-a[i]] + a[i]);
cout << V - dp[n-1][V];
}
迷惑之余,把它简化成了一维,然后没过的也都过了,请问这是为什么捏:
#include<iostream>
#include<vector>
using namespace std;
int main(){
int V, n;
cin >> V >> n;
vector<int> a(n + 1, 0);
vector<int> dp(V + 1, 0);
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= n; i ++)
for(int j = V; j >= a[i]; j --)
dp[j] = max(dp[j], dp[j-a[i]] + a[i]);
cout << V - dp[V];
}