又见01背包
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W的物品,求所有挑选方案中物品价值总和的最大值。1 <= n <=1001 <= wi <= 10^71 <= vi <= 1001 <= W <= 10^9
由于w为10^9无法开出太大的dp数组 因此将价值作为dp的条件,与重量互换
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define MAXN 0x3f3f3f3f
#define min(a,b) a>b? b:a
using namespace std;
struct Node{
int w,v;
}G[105];
int dp[100000];
int main()
{
int n,W,s;
while(~scanf("%d%d",&n,&W)){
s=0;
for(int i=0; i<n ;i++){
scanf("%d%d",&G[i].w,&G[i].v);
s+=G[i].v;
}
for(int i=1;i<=s;i++)dp[i] = MAXN;
dp[0] = 0;
for(int i=0;i<n;i++){
for(int j=s; j>=G[i].v;j--){
dp[j] = min(dp[j] , dp[j-G[i].v] + G[i].w);
}
}
for(int i=s; i>=0;i--){
if(dp[i]<=W){
printf("%d\n",i);break;
}
}
}
return 0;
}