昨天晚上的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范围内。
答案保证在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; } }