题目链接:http://acm.fzu.edu.cn/problem.php?pid=2214

题目大意:给你T组数据,每组有n个物品,一个背包容量B,每件有体积和价值。问你这个背包容纳的物品最大价值是多少。每个物品只能放入一次背包。

 解题思路:首先这个很清楚看出来是个01背包。但是这个背包容量特别大,同时物品的体积很大,总的价值却很少。寻常意义上d[i]表示背包容量为i时的最大价值,那么我们把这个d[]数组的含义改变一下,d[i]表示装价值为i时所需的最小容量。
AC代码:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

int main()
{
 int t,n,c;//案例数
 long long  d[5005];
 scanf("%d",&t);
 while(t--)
 {
  int temp=0;
  memset(d,0x7f,sizeof(d));
  d[0]=0LL;
  scanf("%d %d",&n,&c);
  for(int i=0;i<n;i++)
  {
   int w,v;
   scanf("%d %d",&w,&v);
   temp+=v;
   for(int j=temp;j>=v;j--)
     d[j]=min(d[j],d[j-v]+w);
  }
  for(int i=temp;i>=0;i--)
  if(d[i]<=c) { printf("%d\n",i);break;}
 }
 return 0;
}