一.背包问题:
背包的初始化相关问题:
1.最大价值且恰好装满:dp[0]=0 其他负无穷
2.最小价值且恰好装满:dp[0]=0 其他正无穷
3.不恰好装满:都为0
背包模板:
#include<cstdio>
int main()
{
//W 总重量 n 物品个数 v[i]价值 W[i] 重量
//一维
int dp[MAX],v[MAX],w[MAX];
//01背包问题
for(int i=1;i<=n;i++)
for(int j=W;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
//完全背包问题
for(int i=1;i<=n;i++)
for(int j=w[i];j<=W;j++)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
//多重背包 n[i] 个数
void zero(int cost,int val)
{
for(int i=W;i>=cost;i--)
dp[i]=max(dp[i],dp[i-cost])+val;
}
void comple(int cost,int val)
{
for(int i=cost;i<=W;i++)
dp[i]=max(dp[i],dp[i-cost]+val);
}
void muti(int cost,int val,int num)
{
if(cost*num>=W)//num个里面可以凑够W
{
comple(cost,val);
}
else{//否则二进制