第十四届华中科技大学程序设计竞赛决赛 F.Beautiful Land(01背包变形)


       题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/charles_zaqdt/article/details/80314677