有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W
的物品,求所有挑选方案中物品价值总和的最大值。
1 <= n <=100
1 <= wi <= 10^7
1 <= vi <= 100
1 <= W <= 10^9
一看到质量的范围,直接懵比了,但仔细想一想,我们可以根据一定的价值,求出满足该价值下最小的质量
从后向前遍历,某个dp[i]< = w,最大价值即为i;
int dp[11000], w[120], v[120];
int main()
{
int i, j, k, t, n, m, s;
s = 0x3f3f3f3f;
while(scanf("%d%d",&n,&m) != EOF)
{
t = 0;
for ( i = 1; i <= n; i++)
{
scanf("%d%d",&w[i],&v[i]);
t = t + v[i];
}
for ( j = 0; j < 11000; j++)
dp[j] = s; //求最小值,初始化为很大的一个数
dp[0] = 0; //0对应0, 不要忘记这一行, 因为这是确定的
for ( i = 1; i <= n; i++)
{
for ( j = t; j >= v[i]; j--)
{
if(dp[j] > dp[j-v[i]] + w[i])
dp[j] = dp[j-v[i]] + w[i]; //dp[j] = min(dp[j],dp[j-v[i]] +w[i]);
}
}
for ( j = t; j >= 0; j--)
{
if(dp[j] <= m)
{
printf("%d\n",j); //找出某价值对应的质量小于等于m,即为所求。
break;
}
}
}
return 0;
}