01背包 肌肉男看电影

试题 算法提高 01背包:

问题描述

  给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.

输入格式

  输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。
  以后N行每行两个数Wi和Vi,表示物品的重量和价值

输出格式

  输出1行,包含一个整数,表示最大价值。

样例输入

3 5
2 3
3 5
4 7

样例输出

8

数据规模和约定

  1<=N<=200,M<=5000.

注意点:

1.ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);虽然可以增加运行效率,但是谨慎使用有可能造成输出顺序问题。

2.数组dp需要进行初始化,否则会测评不通过。

代码:

#include <bits/stdc++.h>
using namespace std;
int dp[5001];
int main() {  
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n,m;
  	cin>>n>>m;
	int w[n+1],v[n+1];
	for(int i=1;i<=n;i++){
		cin>>w[i]>>v[i];
	} 

	for(int i=1;i<=n;i++){
		for(int j=m;j>=w[i];j--){
			dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
		}
	}
	cout<<dp[m];
    return 0;  
}

试题 算法提高 肌肉男看电影

 T大计算机系费尽九牛二虎之力,终于挖来了某系第一肌肉男(从此被称为计算机第0肌肉男)。他平时除了自习,就是看电影,尤其是一些霓虹的台词较少的动作片。但是即使肌肉男有强大的肌肉,仍然会面临每个月有限的流量耗尽的问题。已知肌肉男的流量p是有限的,现在有某舍友提供的n部最新电影,看每部电影会消耗肌肉男一定的流量,但是也会给肌肉男带来一定的兴奋值。肌肉男想在自己有能力的情况下产生最多的兴奋值,他由于平时忙于上自习,把这个任务交给了你,如果你能完成,他就帮你领一年的外卖哦!
  输入数据第一行有一个数字p,表示肌肉男的流量值;第二行是一个数字n,表示一共有n部电影;以下有n行,每行第一个数表示该电影消耗的流量大小,第二个数表示该电影带给肌肉男的兴奋值。
  输出数据只有一行,表示肌肉男所能达到的最大兴奋值。

题目分析:

1.数组w表示消耗的流量值,数组v表示带来的兴奋值。

2.数组dp表示在p流量值下的最大兴奋值。

代码:

#include <bits/stdc++.h>
using namespace std;

int main() {  
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n,p;
    cin>>p>>n;

	int w[n+1],v[n+1],dp[p+1];
	for(int i=1;i<=n;i++){
		cin>>w[i]>>v[i];
	}
	
	for(int i=0;i<=p;i++){
		dp[i]=0;
	}
	
	for(int i=1;i<=n;i++){
		for(int j=p;j>=w[i];j--){
			dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
		}
	}
	cout<<dp[p];
    return 0;  
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值