zoukankan      html  css  js  c++  java
  • 【洛谷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
    ",dp_t[m][r]);
    }
    
    int main(){
    	read_and_parse();
    	solve();
    	return 0;
    } 
    
  • 相关阅读:
    学习Python中的集合
    ubuntu14.04下 安装matlabR2015b遇到的一些问题及其解决方法
    matlab的一些关于块分类的函数~~~
    20145207 《Java程序设计》第二周学习总结
    20145207 调查问卷
    20145207 《Java程序设计》第一周学习总结
    10、装饰者模式
    9、观察者模式
    8、迭代器模式
    7、适配器模式
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10088950.html
Copyright © 2011-2022 走看看