新手守护
c++里的背包分为01背包,完全背包,多重背包,满箱背包
01背包:
#include<iostream>
using namespace std;
void read()
{
int n,c,v[10001],w[10001],f[10001],i,j;
cin>>n;
for(i=1;i<=n;i++)
cin>>v[i];
for(i=1;i<=n;i++)
cin>>w[i];
cin>>c;
for(i=1;i<=n;i++)
for(j=c;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+v[i]);
cout<<f[c];
}
int main()
{
read();
return 0;
}
多重背包:
#include<iostream>
using namespace std;
void read()
{
int x[10001],f[10001],v[10001],w[10001],n,i,j,k,c;
cin>>n;
for(i=1;i<=n;i++)
cin>>v[i];
for(i=1;i<=n;i++)
cin>>w[i];
for(i=1;i<=n;i++)
cin>>x[i];
cin>>c;
for(i=1;i<=n;i++)
for(j=c;j>=w[i];j--)
for(k=0;k<=x[i];k++)
if(j>=k*w[i])
f[j]=max(f[j],f[j-k*w[i]]+k*v[i]);
cout<<f[c];
}
int main()
{
read();
return 0;
}
满箱问题:
#include<iostream>
using namespace std;
int n,w[1001],c;
bool ya[1001];
void read()
{
int i,j,k;
cin>>n;
for(i=1;i<=n;i++)
cin>>w[i];
cin>>c;
ya[0]=1;
for(i=1;i<=n;i++)
for(j=c;j>=w[i];j--)
ya[j]=ya[j]||ya[j-w[i]];
for(k=c;k>=w[i];k--)
if(ya[k]==1)
{
cout<<c-k<<endl;
return ;
}
}
int main()
{
read();
return 0;
}
完全背包:
#include<iostream>
using namespace std;
int n,c,w[10001],v[10001],ya[10001],i,j,k;
void read()
{
cin>>n;
for(i=1;i<=n;i++)
cin>>w[i];
for(i=1;i<=n;i++)
cin>>v[i];
cin>>c;
for(i=1;i<=n;i++)
for(j=w[i];j<=c;j++)
ya[j]=max(ya[j],ya[j-w[i]]+v[i]);
cout<<ya[c]<<endl;
}
int main()
{
read();
return 0;
}