01背包#笔记
发布日期:2021-06-29 02:23:33 浏览次数:2 分类:技术文章

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

核心代码

for(int i=1;i<=a;i++){
for(int j=b;j>=0;j--) {
if(j>=t[i]) {
dp[j]=max(dp[j],dp[j-m[i]+v[i]]; } }}

洛谷P1048 [https://www.luogu.com.cn/problem/P1048]

题目描述

辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”如果你是辰辰,你能完成这个任务吗?

输入格式

第一行有 22 个整数 TT(1 \le T \le 10001≤T≤1000)和 MM(1 \le M \le 1001≤M≤100),用一个空格隔开,TT 代表总共能够用来采药的时间,MM 代表山洞里的草药的数目。

接下来的 MM 行每行包括两个在 11 到 100100 之间(包括 11 和 100100)的整数,分别表示采摘某株草药的时间和这株草药的价值。

输出格式

输出在规定的时间内可以采到的草药的最大总价值。

输入输出样例

输入 #1复制

70 3

71 100
69 1
1 2

输出 #1复制

3

说明/提示

【数据范围】

对于 30%30% 的数据,M \le 10M≤10;

对于全部的数据,M \le 100M≤100。

【题目来源】

NOIP 2005 普及组第三题

代码:

#include 
#include
#include
using namespace std;int dp[1000001];int v[105];int t[105];int main(){
int m, s; cin >> m >> s; for (int i = 1; i <= s; i++) {
cin >> t[i] >> v[i]; } for (int i = 1; i <= s; i++) {
for (int j = m; j >= 0; j--) {
if (j >= t[i]) {
dp[j] = max(dp[j], dp[j - t[i]] + v[i]); } } } cout << dp[m];}

P1164 小A点菜(方案总数)

#include 
#include
#include
#include
using namespace std;typedef long long int ll;int a[102];int dp[10002];int main(){
int n, m; cin >> n >> m; dp[0] = 1; for (int i = 1; i <= n; i++) {
cin >> a[i]; } for (int i = 1; i <= n; i++) {
for (int j = m; j >= 0; j--) {
if (j >= a[i]) {
dp[j] += dp[j - a[i]]; } } } cout << dp[m];}

转载地址:https://blog.csdn.net/YYDS777/article/details/114106615 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:JGOJ P1512:区间并集
下一篇:快速排序#笔记

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月31日 14时07分55秒