看了白书回来补这道题,惭愧惭愧
出了一些玄学bug,估计数据不太行。。
http://www.acmicpc.sdnu.edu.cn/problem/show/1539
不太清楚总价值5000,为什么要开一个10000的数组才能ac,不知道到底哪里溢出了
和01背包类似,同样通过递推得到最优解
解题策略:
01背包--相同容量的前提下求最大价值
变种--相同价值的前提下求最小容量消耗,因此此时用min()替换max()所求得的仍为最优解
也就是换了一个枚举对象而已
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
ll dp[10000];
int v[505], w[505];
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
memset(dp, 0x3f, sizeof(dp));
int n, V;
scanf("%d%d", &n, &V);
int sum = 0;
for(int i = 1; i <= n; i ++){
scanf("%d%d", &w[i], &v[i]);
sum += v[i];
}
dp[0] = 0;
for(int i = 1; i <= n; i ++)
{
for(int j = sum; j >= 0; j --)
{
if(j >= v[i])
dp[j] = min(dp[j], dp[j-v[i]]+w[i]);
}
}
int ans;
for(int i = sum; i >= 0; i --)
{
if(dp[i] <= V)
{
ans = i;
break;
}
}
printf("%d\n", ans);
}
return 0;
}