链接:https://www.nowcoder.com/questionTerminal/6ce78d70a25347058004691035d7540b
来源:牛客网
有一个体积为V的背包,有m种物品,每种物品有体积和价值,且数量一定。求背包能装下的最大价值。
输入描述:
第一行两个整数V和m。 接下来m行,每行3个整数,表示第i种物品的数量、体积和价值。 V≤104, m≤500V\leq10^4,\ m≤500V≤104, m≤500,个数、体积、价值不超过1000
输出描述:
输出一个整数,表示背包能装下的最大价值。
示例1
输入
10 4 2 3 2 2 4 3 1 2 2 4 5 3
输出
8
代码
注意数据的大小,开数组要开够。01背包遍历容量从大到小。
#include<bits/stdc++.h>
using namespace std;
int v[10005],w[10005];
int dp[10005];
int main(){
int all,m,k=0;
cin>>all>>m;
for(int i=0;i<m;i++){
int a,b,n;
cin>>n>>a>>b;
int cnt=1;
while(n>0){
if(n>=cnt){
w[k]=cnt*a;
v[k++]=cnt*b;
}else{
w[k]=n*a;
v[k++]=n*b;
}
n-=cnt;
cnt*=2;
}
}
for(int i=0;i<k;i++){
for(int j=all;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
cout << dp[all] <<endl;
}