题目
题目链接
思路
Day2同种类型的题目,只不过这个是一种物品可以放多个
则使用一维数组最为简单,或者说你可以依旧使用二维数组,但是中间要加一个for循环,判断拿几个的时候价值最大
代码
#include<iostream>
#include<algorithm>
using namespace std;
long long t,m;
long long dp[10000002]={0};
long long a[10002][2];
int main(){
cin>>t>>m;
for(long long i=1;i<=m;i++){
cin>>a[i][0]>>a[i][1];
}
for(long long j=1;j<=m;j++){
for(long long i=1;i<=t;i++){
if(i>=a[j][0]){
dp[i]=max(a[j][1]+dp[i-a[j][0]],dp[i]);
}
else{
dp[i]=dp[i];
}
}
}
cout<<dp[t];
return 0;
}
巩固题
巩固题链接
巩固题注意事项
**1.数据大小不要想当然,多用long long 总没错**
**2.注意本题有一点是,失败了也有经验拿(相当于那个物品虽然不放,也有价值存于背包),因此背包容量递增要从0开始,因为0也有价值**
**3.刚开始代码出错了,是因为我把循环中j写成了总量x**
标题
代码
#include<iostream>
#include<algorithm>
using namespace std;
long long n,x;
long long a[1002][3];
long long dp[1002][1002]={0};
int main(){
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i][0]>>a[i][1]>>a[i][2];
}
for(int i=1;i<=n;i++){
for(int j=0;j<=x;j++){
if(j>=a[i][2]){
dp[i][j]=max(a[i][1]+dp[i-1][j-a[i][2]],dp[i-1][j]+a[i][0]);
}
else{
dp[i][j]=dp[i-1][j]+a[i][0];
}
}
}
cout<<dp[n][x]*5;
return 0;
}