zoukankan      html  css  js  c++  java
  • RQNOJ PID57 / 找啊找啊找GF

    题意:sqybi现在有m块大洋,r的人品。请i号MM吃饭要花rmb[i]块大洋.要耗费rp[i]的人品,time[i]的时间   求他泡到最多的MM花费的最少时间是多少

    【思路】 扩展的01背包了。。  再多加一维 和一个记录时间的数组就可以了  d[j][k]:将前i个mm中 用j块大洋 k单位人品 最多可以泡到几个       

                d[j][k]=max(d[j-rmb[i]][k-rp[i]]+1)

    ac 代码


    #include<string.h> #include<stdio.h> //using namespace std; int d[102][102],r[102],rmb[102],rp[102],time[102],cost[102][102]; int main() { int i,j,n,m,t,r,k; while(~scanf("%d",&n)) { for(i=0;i<n;i++) scanf("%d%d%d",&rmb[i],&rp[i],&time[i]); scanf("%d%d",&m,&r); for(i=0;i<=m;i++) for(j=0;j<=r;j++) cost[i][j]=10000000; memset(d,0,sizeof(d)); //d[0][0]=1; cost[0][0]=0; for(i=0;i<n;i++) for(j=m;j>=rmb[i];j--) for(k=r;k>=rp[i];k--) { if(d[j][k]<d[j-rmb[i]][k-rp[i]]+1) { d[j][k]=d[j-rmb[i]][k-rp[i]]+1; cost[j][k]=cost[j-rmb[i]][k-rp[i]]+time[i]; } if(d[j][k]==d[j-rmb[i]][k-rp[i]]+1&&cost[j][k]>cost[j-rmb[i]][k-rp[i]]+time[i]) cost[j][k]=cost[j-rmb[i]][k-rp[i]]+time[i]; } int ans=0; for(i=0;i<=m;i++) for(j=0;j<=r;j++) if(ans<d[i][j]) ans=d[i][j]; int final=10000000; for(i=0;i<=m;i++) for(j=0;j<=r;j++) if(d[i][j]==ans&&final>cost[i][j]) final=cost[i][j]; printf("%d ",final); } return 0; }
  • 相关阅读:
    6、加法算术
    5、找出最大和最小的数
    4、计算并输出圆的面积和周长
    2、函数y=f(x)
    1、两数的平方和
    单片机中断寄存器知识点总结
    创建PCB原理图的模板
    电机知识
    结合实例谈谈航拍全景的方法和技巧
    航拍技巧
  • 原文地址:https://www.cnblogs.com/assult/p/3446427.html
Copyright © 2011-2022 走看看