枚举每件物品,背包容量从后往前枚举,之所以从后往前枚举是因为后面的结果不影响前面的结果,并且取得的结果也是最优结果。
代码如下:
01.
#include<stdio.h>
02.
#define max(a,b)a>b?a:b
03.
int
main()
04.
{
05.
int
N,V;
06.
while
(
scanf
(
"%d%d"
,&N,&V)!=EOF&&(N||V))
07.
{
08.
int
w[1010],v[1010],dp[1010];
09.
for
(
int
i=1;i<=N;i++)
10.
scanf
(
"%d%d"
,&w[i],&v[i]);
11.
for
(
int
i=0;i<=V;i++)
12.
dp[i]=0;
13.
for
(
int
i=1;i<=N;i++)
14.
{
15.
for
(
int
j=V;j>=w[i];j--)
16.
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
17.
}
18.
printf
(
"%d\n"
,dp[V]);
19.
}
20.
return
0;
21.
}