又见01背包

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述
    有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W 
的物品,求所有挑选方案中物品价值总和的最大值。
  1 <= n <=100
  1 <= wi <= 10^7
  1 <= vi <= 100
  1 <= W <= 10^9
 
输入
多组测试数据。
每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的wi 和 vi。
输出
满足题意的最大价值,每组测试数据占一行。
样例输入
4 5
2 3
1 2
3 4
2 2
样例输出
7
来源
飘谊系列
上传者
TC_张友谊
W太大, 数组会爆, 考虑价值一定时, 求获得当前价值的最小体积, 最后加一个判断。
#include <cstdio>
#include <cmath>
#define N 101
#define min(a,b) ((a)<(b)?(a):(b))
const int MAXN = 1e9+1; 
int wei[N], val[N], dp[N*N];
int main(){
    int n, m;
    while(scanf("%d%d", &n, &m) != EOF){
        int sum = 0;
        for(int i = 1; i <= n; i++){
            scanf("%d%d", &wei[i], &val[i]);
            sum += val[i];
        }
        for(int i = 1; i <= sum; i++)
            dp[i] = MAXN;
        dp[0] = 0;
        for(int i = 1; i <= n; i++)
            for(int w = sum; w >= val[i]; w--)
                dp[w]=min(dp[w], dp[w-val[i]]+wei[i]);
        for(int i = sum; i >= 0; i--)
             if(dp[i] <= m){
                printf("%d\n", i); 
                break;
            }
    }
    return 0;
}

 

posted on 2015-12-29 10:56  cleverbiger  阅读(164)  评论(0编辑  收藏  举报