01揹包
先輸入總容納量m 再輸入物品數量n
下面n行先輸入每個物品的質量和價值
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int m,n,w[100001],c[100001],f[100001];
int main()
{
scanf("%d%d",&m,&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&w[i],&c[i]);
for (int i=1;i<=n;i++)
for (int v=m;v>=w[i];v--)
f[v]=max(f[v],f[v-w[i]]+c[i]);
printf("%d",f[m]);
return 0;
}
完全揹包
先輸入總容納量m 再輸入物品數量n
下面n行先輸入每個物品的質量和價值
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int m,n,w[100001],c[100001],f[100001];
int main()
{
scanf("%d%d",&m,&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&w[i],&c[i]);
for (int i=1;i<=n;i++)
for (int v=w[i];v<=m;v++)
f[v]=max(f[v],f[v-w[i]]+c[i]);
printf("%d",f[m]);
return 0;
}
分組揹包
先輸入總容量m再輸入物品總個數n再輸入最大的分組數
接下來n行
每行先輸入每個物品的質量,價值和所在的組別
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int m,n,t,w[1001],c[1001],a[1001][10001],f[10001];
int main()
{
scanf("%d%d%d",&m,&n,&t);
for (int i=1;i<=n;i++)
{
int q;
scanf("%d%d%d",&w[i],&c[i],&q);
a[q][++a[q][0]]=i;
}
for (int i=1;i<=t;i++)
for (int j=m;j>=0;j--)
for (int k=1;k<=a[i][0];k++)
if (j>=w[a[i][k]])
f[j]=max(f[j],f[j-w[a[i][k]]]+c[a[i][k]]);
printf("%d\n",f[m]);
return 0;
}
多重揹包
先輸入總容量m再輸入物品總個數n再輸入最大的分組數
接下來n行
每行先輸入每個物品的質量,價值和能夠取得最大個數(0…s[i])
#include <cstdio>
#include <iostream>
using namespace std;
int m,n,w[100001],c[100001],s[100001],f[100001];
int main()
{
scanf("%d%d",&m,&n);
for (int i=1;i<=n;i++)
scanf("%d%d%d",&w[i],&c[i],&s[i]);
for (int i=1;i<=n;i++)
for (int v=m;v>=0;v--)
for (int k=0;k<=s[i];k++)
if (v>=k*w[i])
f[v]=max(f[v],f[v-k*w[i]]+k*c[i]);
printf("%d",f[m]);
return 0;
}
二維揹包
第一行三個整數,N,V,M,用空格隔開,分別表示物品件數、揹包容積和揹包可承受的最大重量。
接下來有 N 行,每行三個整數 vi,mi,wi,用空格隔開,分別表示第 i 件物品的體積、重量和價值。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int m1,m2,n,w1[1001],w2[1001],c[1001],f[1001][1001];
int main()
{
scanf("%d%d%d",&n,&m1,&m2);
for (int i=1;i<=n;i++)
scanf("%d%d%d",&w1[i],&w2[i],&c[i]);
for (int i=1;i<=n;i++)
for (int j=m1;j>=w1[i];j--)
for (int k=m2;k>=w2[i];k--)
{
f[j][k]=max(f[j-w1[i]][k-w2[i]]+c[i],f[j][k]);
}
printf("%d",f[m1][m2]);
return 0;
}
對於揹包的方案數求解
完全揹包:
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int m,n,w[100001],c[100001],f[100001];
int main()
{
scanf("%d%d",&m,&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&w[i],&c[i]);
f[0]=1;
for (int i=1;i<=n;i++)
for (int v=w[i];v<=m;v++)
f[v]+=f[v-w[i]];
printf("%d",f[m]);
return 0;
}
01揹包:
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int m,n,w[100001],c[100001],f[100001];
int main()
{
scanf("%d%d",&m,&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&w[i],&c[i]);
f[0]=1;
for (int i=1;i<=n;i++)
for (int v=m;v<=w[i];v--)
f[v]+=f[v-w[i]];
printf("%d",f[m]);
return 0;
}