然而一次模拟赛发现了自己根本就不知道背包是个啥……于是开始了新征程:
01 Pack:
模板代码:
#include <iostream>
#include <algorithm>
using namespace std;
int F[10000],C,V,N,W,i,v;
int main()
{
cin >> N >> V;
for (i=1;i<=N;i++)
{
cin >> C >> W;
for (v=V;v>=C;v--)
F[v]=max(F[v],F[v-C]+W);
}
cout << F[V];
}
作为函数的代码:
void ZeroOnePack(int C,int W,int V)
{
for (int v=V;v>=C;v--)
F[v]=max(F[v],F[v-C]+W);
}
Complete Pack:
模板代码:
include <iostream>
#include <algorithm>
using namespace std;
int F[10000],C,V,N,W,i,v;
int main()
{
cin >> N >> V;
for (i=1;i<=N;i++)
{
cin >> C >> W;
for (v=C;v<=V;v++) //注意背包九讲中的解释||其实就是把01倒过来就行了
F[v]=max(F[v],F[v-C]+W);
}
cout << F[V];
}
作为函数的代码:
void CompletePack(int C,int W,int V)
{
for (int v=C;v<=V;v++)
F[v]=max(F[v],F[v-C]+W);
}
MultiPack:
模板代码:
#include <iostream>
#include <algorithm>
using namespace std;
int F[10000],C,V,N,W,Num,i,v;
void CompletePack(int C,int W,int V)
{
for (int v=C;v<=V;v++)
F[v]=max(F[v],F[v-C]+W);
}
int main()
{
cin >> N >> V;
for (i=1;i<=N;i++)
{
cin >> C >> W >> Num;
if (Num*C>=V) CompletePack(C,W,V);
else
{
int k=1;
while (k<Num)
{
for (v=V;v>=k*C;v--)
F[v]=max(F[v],F[v-k*C]+k*W);
Num-=k; k<<=1;
}
for (v=V;v>=Num*C;v--)
F[v]=max(F[v],F[v-Num*C]+Num*W);
}
}
cout << F[V];
}
作为函数的代码:
void MultiPack(int C,int W,int NUM,int V)
{
if (Num*C>=V) CompletePack(C,W,V);
else
{
int k=1;
while (k<Num)
{
for (v=V;v>=k*C;v--)
F[v]=max(F[v],F[v-k*C]+k*W);
Num-=k; k<<=1;
}
for (v=V;v>=Num*C;v--)
F[v]=max(F[v],F[v-Num*C]+Num*W);
}
}
Generalization Pack:
代码:
void GeneralizationPack(int A,int B,int C)
{
for(int i=M;i>=1;i--)
for(int x=1;x<=i;x++)
f[i]=max(f[i],f[i-x]+A*x*x+B*x+C);
}