题目:HDOJ-2602
主要参考:1
2
3
核心代码:
1:
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= W; j++)
{
if(j < w[i]) dp[i][j] = dp[i-1][j];
else dp[i][j] = max(dp[i-1][j], dp[i-1][j - w[i]] + v[i]);
}
}
2:
for(int i=0;i<n;i++)
{
for(int j=v;j>=0;j--)
{
if(j>=c[i])
dp[j]=max(dp[j-c[i]]+w[i],dp[j]);
}
}
各仿照写了一段,一段AC,一段WA,原因不详。
AC:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define N 1000
int main()
{
int i,j,n,v,t,va[N],vo[N],*p;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&v);
for(i=0;i<n;i++)
scanf("%d",va+i);
for(i=0;i<n;i++)
scanf("%d",vo+i);
p=(int*)calloc(v+1,sizeof(int));
assert(p);
for(i=0;i<n;i++)
for(j=v;j>=vo[i];j--)
p[j]=p[j]>p[j-vo[i]]+va[i]?p[j]:p[j-vo[i]]+va[i];
printf("%d\n",p[v]);
free(p);
}
return 0;
}
WA:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define N 1000
int _max_(int a,int b)
{
return a>b?a:b;
}
int main()
{
int t;
int va[N],vo[N];
int n,v;
int i,j;
int *p;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&v);
for(i=0;i<n;i++)
scanf("%d",va+i);
for(i=0;i<n;i++)
scanf("%d",vo+i);
p=(int*)calloc((n+1)*(v+1),sizeof(int));
assert(p);
int m=v+1;
for(i=1;i<=n;i++)
{
for(j=1;j<=v;j++)
{
if(j<vo[i-1])
{
p[i*m+j]=p[(i-1)*m+j];
}
else
{
p[i*m+j]=_max_(p[(i-1)*m+j],p[(i-1)*m+j-vo[i-1]]+va[i-1]);
}
}
}
printf("%d\n",p[(n+1)*(v+1)-1]);
free(p);
}
return 0;
}
网友评论