【洛谷P1509】找GF

题目大意:给定 N 个物品,每个物品有两个维度的费用,有两个维度的价值,求在有一定费用基础的前提下,满足其中一个维度的价值最大化的前提下,第二个维度的价值最小是多少。

题解:由于是两个维度的价值,因此在 dp 转移决策阶段需要发生改变,来满足题目需求。
题目要求的是在最优化一个变量的时候可以最优化另一个变量,对于这种情况,可以发现附带最优化的变量发生改变的时候一定是第一个最优化变量改变或有另一个状态转移同样满足第一个维度的最优化时,用两个 dp 数组分别记录各自最优化的值即可。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=110;

int n,m,r,mon[maxn],t[maxn],rp[maxn];
int dp[maxn][maxn],dp_t[maxn][maxn];//此处写结构体也可以

void read_and_parse(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d%d%d",&mon[i],&rp[i],&t[i]);
    scanf("%d%d",&m,&r);
}

void solve(){
    for(int i=1;i<=n;i++)
        for(int j=m;j>=mon[i];j--)
            for(int k=r;k>=rp[i];k--){
                if(dp[j][k]<dp[j-mon[i]][k-rp[i]]+1){
                    dp[j][k]=dp[j-mon[i]][k-rp[i]]+1;
                    dp_t[j][k]=dp_t[j-mon[i]][k-rp[i]]+t[i];
                }else if(dp[j][k]==dp[j-mon[i]][k-rp[i]]+1){
                    dp_t[j][k]=min(dp_t[j][k],dp_t[j-mon[i]][k-rp[i]]+t[i]);
                }
            }
    printf("%d\n",dp_t[m][r]);
}

int main(){
    read_and_parse();
    solve();
    return 0;
} 

转载于:https://www.cnblogs.com/wzj-xhjbk/p/10088950.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值