zoukankan      html  css  js  c++  java
  • dp入门问题

    昨天晚上的rank彻底废了。。一个星期没敲代码完全没手感。
    作为总结,贴一道昨天浪费了我两小时的dp。

    http://acm.dirring.com/problem.php?cid=1003&pid=3

    问题 D: Dirring love 音乐

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 34  解决: 10

    题目描述

    上个学期,Dirring给自己的手机升级了安卓6.0,然后发现安卓6.0占用了大量的内存空间,以至于可用空间只剩下了v MB,自己喜欢的n首歌曲不能全部放进去了,悲催的他只好忍痛割爱,决定只拷贝一部分歌曲进去。现在,已知每首歌的大小以及Dirring对每首歌的热爱指数,请你帮帮可怜的他,应该选择拷贝哪些歌曲,以使这些歌曲的热爱指数之和最大。
    答案保证在int范围内。

    输入

    多组数据,对于每组数据,第一行是两个整数,分别代表n(0<n<100)和v(0<v<10000),接下来n行,每行两个整数,分别代表一首歌的大小(MB)和热爱指数。

    输出

    每组数据输出一行,每行一个整数,代表答案。

    样例输入

    3 10
    6 8
    5 6
    5 6

    样例输出

    12

    这道题我一开始想到的是背包问题,忘了音乐本身是不可分的,这应该属于dp问题。智商是硬伤。。。。

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n,m;
        while(cin>>n>>m){
                int a[n+5],b[n+5],dp[m+5];
                memset(a,0,sizeof(a));
                    memset(b,0,sizeof(b));
                        memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++)    cin>>a[i]>>b[i];
            for(int i=1;i<=n;i++){
                for(int j=m;j>=a[i];j--)
                    dp[j]=max(dp[j],dp[j-a[i]]+b[i]);   //  即不断把问题缩小,求出在所有空间大小下的最大值,然后再从中选择就可以。案例中空间是10,所以比较dp[10-6]+能加的最大文件,然后比较dp[10-5]+能加的最大文件。
            }
            cout<<dp[m]<<endl;
        }    }
  • 相关阅读:
    Kafka相关知识点
    好的前端界面
    linux下配置go环境
    插入排序(数据是局部有序的)
    选择排序
    spring jpa 条件查询统计
    java代码优化
    JAVA创建临时文件IO
    spring防止表单重复提交
    Java文件下载时所输出文件名乱码问题
  • 原文地址:https://www.cnblogs.com/upstart/p/5931916.html
Copyright © 2011-2022 走看看