题目描述
普通背包,完全背包,多重背包
不讲了,直接上代码!
⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇
普通背包
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int w[m],v[m],dp[n+1];
for(int i=0;i<m;i++)
{
cin>>w[i]>>v[i];
}
memset(dp, 0, sizeof(dp));
for(int i=0;i<m;i++)
{
for(int j=0;j<=n;j++)
{
if(j-w[i]>=0)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
}
cout<<dp[n];
}
完全背包
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int v[m],w[m],dp[n+1],y[m],sum=0,u=0;
for(int i=0;i<m;i++)
{
cin>>w[i]>>v[i]>>y[i];
sum+=y[i];
}
int b[sum][2];
memset(dp,0,sizeof(dp));
for(int i=0;i<m;i++)
{
for(int j=0;j<y[i];j++)
{
b[u][0]=w[i];
b[u][1]=v[i];
u++;
}
}
for(int i=0;i<sum;i++)
{
for(int j=n;j>=0;j--)
{
if(j-b[i][0]>=0)
{
//dp[10]=max(0,
dp[j]=max(dp[j],dp[j-b[i][0]]+b[i][1]);
}
}
}
for(int i=0;i<=sum;i++)
{
cout<<b[i][0]<<' '<<b[i][1]<<endl;
}
}
多重背包
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e3+233;
const double eps = 1e-8;
typedef long long LL;
int T,n,m,sum,ans;
LL a[maxn];
LL Lmax[maxn],Rmin[maxn];
LL Lsum[maxn],Rsum[maxn];
LL minCostIncThenDec(int n)
{
Lmax[0] = a[0];
Lsum[0] = 0;
//1 4 3 2 5
//Lmax[0]=1
//Lsum[0]=0
for(int i=1; i<n; ++i)
{
Lmax[i] = max(Lmax[i-1]+1, a[i]);
Lsum[i] = Lsum[i-1] + Lmax[i] - a[i];
}
Rmin[n-1] = a[n-1];
Rsum[n-1] = 0;
for(int i=n-2; i>=0; --i)
{
Rmin[i] = max(Rmin[i+1]+1, a[i]);
Rsum[i] = Rsum[i+1] + Rmin[i] - a[i];
}
LL ans = (1LL)*INT_MAX;
LL tmp;
// 1 4 3 2 5
// Lmax[0]=1 Lmax[1]=4 Lmax[2]=5 Lmax[3]=6 Lmax[4]=7
// Lsum[0]=0 Lsum[1]=0 Lsum[2]=2 Lsum[3]=6 Lsum[4]=8
//
// Rmin[4]=5 Rmin[3]=6 Rmin[2]=7 Rmin[1]=8 Rmin[0]=9
// Rsum[4]=0 Rsum[3]=4 Rsum[2]=8 Rsum[1]=12 Rsum[0]=20
for (int i=0; i<n; ++i)
{
if (Lmax[i] > Rmin[i])
{
//3+5=8
tmp = Lsum[i] + Rsum[i] - Rmin[i] + a[i];
}
else
{
//20-1+1=20
//8+4=12
//5+3=8
//4+2=6
tmp = Lsum[i] + Rsum[i] - Lmax[i] + a[i];
}
ans = min(ans, tmp);
}
return ans;
}
void input()
{
//freopen("in.txt","r",stdin);
cin>>n;
for(int i=0; i<n; ++i)
{
cin>>a[i];
}
}
void solve()
{
cout<<minCostIncThenDec(n)<<endl;
}
int main()
{
input();
solve();
}