题目链接: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; }
版权声明:此代码归属博主, 请务侵权!