#include <iostream>
using namespace std;
const int N = 1010;
int v[N],w[N];
int n,m;
int f[N][N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>v[i]>>w[i]; //物品的编号是从0开始的
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
f[i][j]=f[i-1][j];
if(v[i]<=j) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
}
}
cout<<f[n][m];
return 0;
}
复习
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int f[N][N];
int v[N],w[N];
int n,m;
int main()
{
cin>>n>>m;
for (int i = 1; i <= n; i ++ )
{
scanf("%d%d",&v[i],&w[i]);
}
for (int i = 1; i <= n; i ++ )
{
for (int j = 0; j <= m; j ++ )
{
f[i][j]=f[i-1][j];
if(v[i]<=j) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]); //这里第二个参数表示在1-i这i个物品中,满足体积不大于j的可能的最大权重数
}
}
cout<<f[n][m];
return 0;
}
优化为一维
//优化为一维
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int v[N],w[N];
int f[N];
int n,m;
int main()
{
cin>>n>>m;
for (int i = 1; i <= n; i ++ )
{
scanf("%d%d",&v[i],&w[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=m;j>=v[i];j--)
{
f[j]=max(f[j],f[j-v[i]]+w[i]); //每一轮的i所新计算出的f,就代表这一轮的f,逆序后才保证这一轮用到的都是上一轮产生的
}
}
cout<<f[m];
return 0;
}