输入样例
4 5
1 2
2 4
3 4
4 5
输出样例
8
第一种,简单的朴素的dp写法
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int vi[N],wi[N];
int dp[N][N];
int main(void)
{
int n,v;
cin>>n>>v;
for(int i=1;i<=n;i++)
cin>>vi[i]>>wi[i];
for(int i=1;i<=n;i++)
for(int j=0;j<=v;j++)
{
if(j<vi[i])
dp[i][j]=dp[i-1][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-vi[i]]+wi[i]);
}
cout<<dp[n][v];
}
用滚动数组写法
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int vi[N],wi[N];
int dp[N];
int main(void)
{
int n,v;
cin>>n>>v;
for(int i=1;i<=n;i++)
cin>>vi[i]>>wi[i];
for(int i=1;i<=n;i++)
for(int j=v;j>=vi[i];j--)//需要注意一下,从后面往前面dp
dp[j]=max(dp[j],dp[j-vi[i]]+wi[i]);
cout<<dp[v];
}