//01背包
n个体积为c[i],价值为w[i]物品(各一个),装进容量为V的背包,求最大价值:
int dp[N];
sizeof(dp,0,sizeof dp);
for(int i=1;i<=n;i++)
for(int j=V;j>=v[i];j--)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
ans=dp[V];
//完全背包
n个体积为c[i],价值为w[i]物品(各任意个),装进容量为V的背包,求最大价值:
背包不一定装满:
int dp[N];
memset(dp,0,sizeof dp);
for(int i=1;i<=n;i++)
for(int j=v[i];j<=V;j++)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
背包完全装满:
int dp[N];
memset(dp,-0x3f,sizeof dp);
dp[0]=0;
for(int i=1;i<=n;i++)
for(int j=v[i];j<=V;j++)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
ans=dp[V]<0?0:dp[V];
//多重背包:O(n^3)未优化版本
int dp[N];
for(int i=1;i<=n;i++)
{
int v,w,s; cin>>v>>w>>s;//体积、价值、个数
for(int j=V;j>=0;j--)
for(int k=1;k<=s&&j>=k*v;k++)
f[j]=max(f[j],f[j-k*v]+k*w);
}
ans=f[m];
//二维费用背包:
int dp[N][N]
cin>>n>>v>>m;//n个物品,v总体积,m总重量
for(int i=1;i<=n;i++)
{
int a,b,c; cin>>a>>b>>c;//体积,重量,价值
for(int j=v;j>=a;j--)
for(int k=m;k>=b;k--)
dp[i][j]=max(dp[j][k],dp[j-a][k-b]+c);
}
ans=dp[v][m];
//分组背包:
int f[N],v[N],w[N];
cin>>n>>m;//个数、总体积
for(int i=0;i<n;i++)
{
int s; cin>>s;//每一组物品数
for(int j=0;j<s;j++) cin>>v[j]>>w[j];
for(int j=m;j>=0;j--)
for(int k=0;k<s;k++)
if(j>=v[k])
f[j]=max(f[j],f[j-v[k]]+w[k]);
}
ans=f[m];
24/7/29