又見01揹包
所以不妨換個對象,應爲各個物品的價值比較小,把DP的對象從針對與不同的重量計算最大的價值,
最後找到dp[n][j] <= W 時的最大值j;
- 輸入
- 多組測試數據。
每組測試數據第一行輸入,n 和 W ,接下來有n行,每行輸入兩個數,代表第i個物品的wi 和 vi。 - 輸出
- 滿足題意的最大價值,每組測試數據佔一行。
- 樣例輸入
-
4 5 2 3 1 2 3 4 2 2
- 樣例輸出
-
7
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define INF 0x3f3f3f3f
#define max_N 100
using namespace std;
int main()
{
int n,s,i,j;
int dp[max_N+1][max_N*max_N+1];
int w[max_N+1],v[max_N+1];
while(~scanf("%d%d",&n,&s))
{
memset(dp,INF,sizeof(dp));
for(i = 0; i<n; i++)
scanf("%d%d",&w[i],&v[i]);
dp[0][0] = 0; //不要忘了初始化
for(i = 0; i<n; i++)
for(j = 0; j<=n*max_N; j++)//計算前i個物品價值爲j時的最小重量
{
if(j<v[i])
{
dp[i+1][j] = dp[i][j];
}
else
{
dp[i+1][j] = min(dp[i][j],dp[i][j-v[i]]+w[i]);
}
}
int res = 0;
for(i=n*max_N; i>=0; i--)
if(dp[n][i]<=s)//重量爲<=W時的最大價值
{
res = i;
break;
}
printf("%d\n",res);
}
}