优化后的完全背包
PS:DP优化的根本就是等价变形
AcWing链接
优化前
#include <bits/stdc++.h>
using namespace std;
int n,v;
int c[1005],w[1005];
int f[1005][1005];
int main()
{
scanf("%d%d",&n,&v);
for(int i=1; i<=n; i++)
{
scanf("%d%d",&w[i],&c[i]);
}
//输入
for(int i=1; i<=n; i++)
{
for(int j=1;j<=v; j++)
{
f[i][j]=f[i-1][j];
if(j>=w[i])
{
f[i][j]=max(f[i][j],f[i][j-w[i]]+c[i]);
}
}
}
//核心代码
printf("%d",f[n][v]);
return 0;
}
运行时间: 76 ms
运行空间: 4336 KB
优化与优化前对照代码:
#include <bits/stdc++.h>
using namespace std;
int n,v;
int c[1005],w[1005];
int f[1005][1005];
int main()
{
scanf("%d%d",&n,&v);
for(int i=1; i<=n; i++)
{
scanf("%d%d",&w[i],&c[i]);
}
//输入
for(int i=1; i<=n; i++)
{
for(int j=1;j<=v; j++)
{
f[i][j]=f[i-1][j];
if(j>=w[i])
{
f[i][j]=max(f[i][j],f[i][j-w[i]]+c[i]);
}
}
}
//核心代码
printf("%d",f[n][v]);
return 0;
}
优化后完整代码
#include <bits/stdc++.h>
using namespace std;
int n,v;
int c[1005],w[1005];
int f[1005];
int main()
{
scanf("%d%d",&n,&v);
for(int i=1; i<=n; i++)
{
scanf("%d%d",&w[i],&c[i]);
}
//输入
for(int i=1; i<=n; i++)
{
for(int j=w[i];j<=v; j++)
{
f[j]=max(f[j],f[jw[i]]+c[i]);
}
}
//核心代码
printf("%d",f[v]);
return 0;
}
运行时间: 36 ms
运行空间: 216 KB
优化前后时间、空间对比极大QAQ…