2. 01背包问题 - AcWing题库(悟了一个下午😂)用表格理解最佳
朴素型:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
int main()
{
int N,V,i,j;
scanf("%d",&N);
scanf("%d",&V);
int v[1001];
int w[1001];
v[0]=0;w[0]=0;
for(i=1;i<=N;i++)
{
scanf("%d",&v[i]);
scanf("%d",&w[i]);
}
int arr[N+1][V+1];
for(i=0;i<=N;i++)
{
for(j=0;j<=V;j++)
{
if(i==0||j==0)
{
arr[i][j]=0;
}
else
{
if(v[i]>j)
{
arr[i][j]=arr[i-1][j];
}
else
{
if(arr[i-1][j]>arr[i-1][j-v[i]]+w[i])
{
arr[i][j]=arr[i-1][j];
}
else
{
arr[i][j]=arr[i-1][j-v[i]]+w[i];
}
}
}
}
}
printf("%d",arr[N][V]);
return 0;
}
优化型:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
int main()
{
int N,V,i,j;
scanf("%d",&N);
scanf("%d",&V);
int v[1001];
int w[1001];
v[0]=0;w[0]=0;
for(i=1;i<=N;i++)
{
scanf("%d",&v[i]);
scanf("%d",&w[i]);
}
int arr[V+1];
for(i=0;i<=N;i++)
{
for(j=V;j>=0;j--)
{
if(i==0||j==0)
{
arr[j]=0;
}
else
{
if(j>=v[i]&&arr[j]<arr[j-v[i]]+w[i])
{
arr[j]=arr[j-v[i]]+w[i];
}
}
}
}
printf("%d",arr[V]);
return 0;
}