一、题目描述:
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 v[i],价值是 w[i]。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。
二、输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N行,每行两个整数 v[i],w[i],用空格隔开,分别表示第 i 件物品的体积和价值。
三、输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤10000<�,�≤1000 0<vi,wi≤10000<��,��≤1000
输入样例
4 5 1 2 2 4 3 4 4 5
输出样例:
8
四、代码实现
1.二维数组解法
#include<stdio.h>
const int N=10000;
int dp[N][N],v[N],w[N],n,m;
int max(int x,int y)
{
if(x<y)
return y;
else
return x;
}
int main()
{
int i,j;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d %d",&v[i],&w[i]);
for(i=1;i<=n;i++)
{
for(j=v[i];j<=m;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
}
}
printf("%d\n",dp[n][m]);
return 0;
}
2.一维数组解法
#include<stdio.h>
const int N=10000;
int w[N],v[N],dp[N];
int max(int x,int y)
{
if(x<y)
return y;
else
return x;
}
int main()
{
int n,m,i,j;
scanf("%d %d",&n,&m);
for(i=1;i<n;i++)
scanf("%d %d",&v[i],&w[i]);
dp[0]=0;
for(i=1;i<=n;i++)
{
for(j=m;j>=v[i];j--)//二维到一维要倒序
{
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
printf("%d\n",dp[m]);
return 0;
}