您的位置:首页 > 其它

FZU2214 超大背包

2015-12-29 10:07 246 查看
题目大意:给你一个背包,容量为10^9,物品个数500,价值和小于5000,求最大价值

思路:因为容量太大,所以不能按0-1背包问题去求解。注意到物品个数较小,而且价值和只有5000,所以可以逆向思维,求得对应价值下最小的重量,即dp[i]表示总价值为i是的最小重量是多少,则dp[j] = min(dp[j] , dp[j-val[i]]+vol[i]);最后从v(物品总价值开始判断)开始,找到第一个小于等于w(容量)的v即可。。。。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip>

using namespace std;
#define maxn 10003
#define MOD 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define LL __int64

long long dp[5005];

int main()
{
int t;
cin >> t ;
while(t --)
{
int vol[505] , val[505];
memset(dp , 0x3f3f3f3f , sizeof(dp));
long long n , w , v = 0;
cin >> n >> w;
for(int i = 1 ; i <= n ; i ++ )
{
cin >> vol[i] >> val[i];
v += val[i];
}
dp[0] = 0;
for(int i = 1 ; i <= n ; i ++ )
{
for(int j = v ; j >= val[i] ; j --)
{
if(dp[j - val[i]] + vol[i] < dp[j])
dp[j] = dp[j - val[i]] + vol[i];
}
}
// cout << dp[v] << endl;
for(; v >= 0; v--)
{
if(dp[v] <= w)
{
cout << v << endl;
break;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: