背包为v 重量为w[i] 价值为p[i] 共有N个物品
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
const int N=3;
const int V=8;
int w[N+1]={0,1,2,2};
int v[N+1]={0,6,10,20};
int num[N+1]={0,10,5,2};
int f[N+1][V+1]={0};
int main()
{
int n=0;
for(int i=0;i<=N;i++)
f[i][0]=0;
for(int i=0;i<=V;i++)
f[0][i]=0;
//开始打表
for(int i=1;i<=N;i++)
{
for(int j=w[i];j<=V;j++)
{
f[i][j]=0;
n=min(num[i],j/w[i]);//可以放的个数
for(int k=0;k<=n;k++)
f[i][j]=max(f[i][j],f[i-1][j-k*w[i]]+k*v[i]);
cout<<f[i][j]<<" ";
}
cout<<endl;
}
cout<<f[N][V]<<endl;
return 0;
}
多重背包加二进制优化
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
int T,n,k,count;
int a[101],b[101];
int f[100001];
int i,j,m,p,g;
cin>>T;
while(T--)
{
memset(f,0,sizeof(f));
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
cin>>b[i];
cin>>k;
for(i=1;i<=n;i++)
{
p=0;
g=0;
while(b[i]>g)
{
for(j=k;j>=a[i]*g;j--)
{
f[j]=max(f[j],f[j-a[i]*g]+a[i]*g);
}
b[i]-=g;
g=pow(2,p);
p++;
}
for(j=k;j>=a[i]*b[i];--j)
{
f[j]=max(f[j],f[j-a[i]*b[i]]+a[i]*b[i]);
}
}
if(f[k]==k)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}