一维背包:
#include<iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int a[50001],b[50001];
for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
int f[50001]={0};//重量为j的情况下最大价值
for(int i=1;i<=n;i++)
{
for(int j=m;j>=a[i];j--)
if(f[j-a[i]]+b[i]>f[j])
f[j]=f[j-a[i]]+b[i];
}
cout<<f[m]<<endl; //最优解
for(int i=1;i<=m;i++)
cout<<f[i];
return 0;
}
二维背包
#include<iostream>
#include<math.h>
using namespace std;
int f[5001][5001];//i行j列为重量不超过j的前i个物体的最大价值
int main()
{
int m,n;
cin>>n>>m;
int a[50001],b[50001];
for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
for(int i=1;i<=n;i++)
for(int j=m;j>0;j--)
{
if(a[i]<=j)f[i][j]=max(f[i-1][j],f[i-1][j-a[i]]+b[i]);
//f[i-1][j]没拿时的价值,f[i-1][j-a[i]]+b[i]拿了之后的价值
//i为前i个物体,j为剩余背包空间
else f[i][j]=f[i-1][j];
}
//cout<<f[n][m]<<endl; //最优解
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<f[i][j];
cout<<endl;
}
return 0;
}