首页 > 代码库 > dp入门问题

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;
    }    }

dp入门问题