题目描述
在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数)。求背包能够容纳的最大价值。
输入
第1行,2个整数,N和W中间用空格隔开。N为物品的数量,W为背包的容量。(1 <= N <= 100,1 <= W <= 10000)
第2 - N + 1行,每行2个整数,Wi和Pi,分别是物品的体积和物品的价值。(1 <= Wi, Pi <= 10000)
输出
输出可以容纳的最大价值。
输入样例
3 6
2 5
3 8
4 9
输出样例
14
主要思想:dp[ i ][ j ] 表示在面对第 i 件物品,且背包容量为 j 时所能获得的最大价值
代码实现
#include<stdio.h>
#include<math.h>
int PP[101][10001];
//int WW[101];
int P[101];
int W[101];
int maxi(int a,int b)
{
return a>=b?a:b;
}
int main(){
int N,M,i,j;
scanf("%d%d",&N,&M);
for(i=1;i<=N;i++)
scanf("%d%d",&W[i],&P[i]);
for(i=1;i<=N;i++){
for(j=0;j<=M;j++){
if(j-W[i]<0)//判断容量为j,是否能装下第i件物品
PP[i][j]=PP[i-1][j];//背包问题 51 nod
else if(W-W[i]>=0){//能够装下
PP[i][j]=maxi(PP[i-1][j-W[i]]+P[i],PP[i-1][j]);//看装下后是否能使价值更大
}
}
}
printf("%d\n",PP[N][M]);
return 0;
}