A-采药
题意:题目的意思很明确,药童上山采药,要你求在规定的时间内使采药的价值最大
题解:标准的0-1背包格式,每一件物品只有两种状态:选 or 不选;每一件物品只能用一次。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int T,M;
int v[150]={0},p[150]={0};
ll f[1010]={0};
int main(){
cin>>T>>M;
for(int i=1;i<=M;i++){
cin>>v[i]>>p[i];
}
for(int i=1;i<=M;i++){
for(int j=T;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+p[i]);
}
}
cout<<f[T]<<endl;
return 0;
} B-开心的金明
题意:简单的0-1背包问题,但这里要我们求得是体积与价值的乘积和最大的值
题解:简单0-1背包
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int N,m;
int v[30]={0};
int p[30]={0};
ll num[30][30010]={0};
ll ans[30010]={0};
int main(){
cin>>N>>m/*m件物品*/;
//方法 一
for(int i=1;i<=m;i++){
cin>>v[i]>>p[i];
}//数据输入完毕,下面开始遍历背包
for(int i=1;i<=m;i++){
for(int j=N;j>=v[i];j--){
ans[j]=max(ans[j],ans[j-v[i]]+v[i]*p[i]);
}
}
//方法 二
// for(int i=1;i<=m;i++){
// for(int j=0;j/*这个相当于容量*/<=N;j++){
// num[i][j]=num[i-1][j];
// if(j>=v[i]){
// num[i][j]=max(num[i][j],num[i-1][j-v[i]]+v[i]*p[i]);
// }
// }
// }
// ll res=0;
// for(int i=0;i<=N;i++) res=max(res,num[m][i]);
// cout<<res<<endl;
cout<<ans[N]<<endl;
return 0;
} 


京公网安备 11010502036488号