博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客网哈尔滨工程大学第十四届程序设计竞赛(同步赛)——D 简单的烦恼(DP)
阅读量:4049 次
发布时间:2019-05-25

本文共 851 字,大约阅读时间需要 2 分钟。

这道题可以用DP来做,实质上是个背包模型,因为它有一个费用t。

状态:dp[i,j]表示前i首歌,在j分钟内可以听的歌曲的总时长。
状态转移方程:
dp[i,j]=
if(j<song[i]) dp[i-1,j];
else max(dp[i-1,j],dp[i-1,j-song[i]]+song[i]);
在这里要注意一下:因为我们要选出最接近时间t的歌曲的时间总和sum(不能>=t),然后sum+max(song[i]),这样才可以使时间最长。因此j的范围是[song[i],t-1]。
这里的j和dp[i,j]所表示的意义都是时间,说明背包中DP对象以及DP意义的物理意义是可以一样——其实只要有费用,就可以想到用背包模型来做。

代码如下:

#include
#include
#include
#include
#include
typedef long long ll;using namespace std;const int inf=0x3f3f3f3f;const int maxn=8e4+5;int dp[maxn],s[205]; //用了滚动数组int main(){ int T,n,t,i,j; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&t); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) scanf("%d",&s[i]); sort(s+1,s+1+n); dp[0]=0; for(i=1;i<=n-1;i++) //i止于n-1 for(j=t-1;j>=s[i];j--) dp[j]=max(dp[j],dp[j-s[i]]+s[i]); printf("%d\n",dp[t-1]+s[n]); } return 0;}

转载地址:http://jddci.baihongyu.com/

你可能感兴趣的文章
慢慢欣赏linux 内核模块引用
查看>>
kprobe学习
查看>>
慢慢欣赏linux phy驱动初始化2
查看>>
慢慢欣赏linux CPU占用率学习
查看>>
2020年终总结
查看>>
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
adb command not found
查看>>
Xcode 启动页面禁用和显示
查看>>
【剑指offer】q50:树中结点的最近祖先
查看>>
二叉树的非递归遍历
查看>>
【leetcode】Reorder List (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Candy(python)
查看>>