【洛谷P1509】找GF

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

题解:由于是两个维度的价值,因此在 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;
} 

猜你喜欢

转载自www.cnblogs.com/wzj-xhjbk/p/10088950.html