揹包程序彙總

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章