试题 算法提高 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;
}