题目链接:https://www.nowcoder.com/acm/contest/119/F
题意是有T组数据,然后输入n,m,表示有n种树,最大容量是m,然后n行输入每种树的花费和价值,问能得到的最大价值,看一眼数据范围就知道不是简单的裸的01背包了,这种题之前也见过好多次,需要把最小容量最大价值的问题转换成按照价值去求最小花费。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#define ll long long
using namespace std;
ll dp[10000005];
ll val[105],v[105];
ll T,n,m;
int main()
{
scanf("%lld",&T);
while(T--){
scanf("%lld%lld",&n,&m);
int sum = 0;
for(int i=0;i<n;i++){
scanf("%lld%lld",&v[i],&val[i]);
sum += val[i];
}
memset(dp,0x3f3f3f3f,sizeof(dp));
dp[0] = 0;
for(int i=0;i<n;i++){
for(int j=sum;j>=val[i];j--){
dp[j] = min(dp[j], dp[j - val[i]] + v[i]);
}
}
// int ans = -1;
for(int i=sum;i>=0;i--){
if(dp[i] <= m){
printf("%d\n",i);
break;
}
}
}
return 0;
}