#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int N=1010; int t[N]; int m[N]; int T;//时间 int M;//草药数量 int dp[N]; int main() { //比较明显的01背包问题 cin>>T>>M; for(int i=1;i<=M;i++) { cin>>t[i]>>m[i]; } int res=0; for(int i=1;i<=M;i++) { for(int j=T;j>=t[i];j--) { dp[j]=max(dp[j],dp[j-t[i]]+m[i]); res=max(res,dp[j]); } } cout<<res; return 0; }
acwing 装箱问题 【ACWing】1024. 装箱问题_装箱问题 acwing-CSDN博客
可以在这看问题
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=30;
int nums[N];
int V;
int n;
int dp[N];
int main()
{
cin>>V;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>nums[i];//不仅是体积还是价值
}
//这个是一个01背包问题,就是将剩余的箱子的体积位最小
//换句话说就是将 这个箱子的体积转入最大的数量、
int res=0;
for(int i=1;i<=n;i++)
{
for(int j=V;j>=nums[i];j--)
{
//dp[j]的含义为:在前i个物品中在背包体积为j的情况下的最大值
dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]) ;
res=max(res,dp[j]);
}
}
cout<<V-res;
return 0;
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using LL=long long;
using namespace std;
int m;//总钱数
int n;//购买物品的个数
const int N=3e5+10;
int v[N],p[N];
LL sum[N];
//v是物品的价格 p是物品的价值
LL dp[N];
int main()
{
cin>>m>>n;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>p[i];
sum[i]=v[i]*p[i];//相当于01背包问题的价值
}
LL res=0;
for(int i=1;i<=n;i++)
{
for(int j=m;j>=v[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+sum[i]);
res=max(res,dp[j]);
}
}
cout<<res;
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
int nums[N][N];
int n;
int dp[N][N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>nums[i][j];
}
}
//使用dp进行解决问题
// dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+nums[i][j];选择最大的那个
int res=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+nums[i][j];
res=max(res,dp[i][j]);
}
}
cout<<res;
return 0;
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=110;
int nums[N][N];
int dp[N][N];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>nums[i][j];
}
}
// dp[1][1]=nums[1][1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
dp[i][j]=max(dp[i-1][j]+nums[i][j],dp[i-1][j-1]+nums[i][j]);
}
}
if(n%2==0)
{
//偶数
cout<<max(dp[n][n/2],dp[n][(n/2)+1]);
} else
{
//奇数
cout<<dp[n][(n/2)+1];
}
return 0;
}