完全背包:特点是n种物品每种物品有无限件可用,所以与01背包的区别是背包容量V从前往后枚举,这样的话,前面的结果就会影响后面的结果,那么如果这样的话,每种物品就不是取与不取两种结果了,而是可以取多件。
(此题要求判断背包是否装满,所以dp[0]必须初始化为0)
代码如下:
#include<stdio.h>
02.
#include<string.h>
03.
#define max(a,b)a>b?a:b
04.
#define min -99999999
05.
int
main()
06.
{
07.
int
icase;
08.
scanf
(
"%d"
,&icase);
09.
while
(icase--)
10.
{
11.
int
N,V,dp[50010],v[2010],w[2010];
12.
scanf
(
"%d%d"
,&N,&V);
13.
dp[0]=0;
14.
for
(
int
i=1;i<=V;i++)
15.
dp[i]=min;
16.
for
(
int
i=1;i<=N;i++)
17.
scanf
(
"%d%d"
,&w[i],&v[i]);
18.
for
(
int
i=1;i<=N;i++)
19.
{
20.
for
(
int
j=w[i];j<=V;j++)
//一种物品可以放多件
21.
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
22.
}
23.
if
(dp[V]<0)
24.
printf
(
"NO\n"
);
25.
else
26.
printf
(
"%d\n"
,dp[V]);
27.
}
28.
return
0;
29.
}