01背包问题解释详见博客:
https://blog.csdn.net/mu399/article/details/7722810
此博客主要介绍如何减低空间复杂度,对应题目hihocode #1038
1.先附上最普通没有任何优化的写法
#include <cstdio>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
ll val[600];
ll wei[600];
ll ans[600][100010];
int main()
{
ll n,m;
cin>>n>>m;
for(int i=0;i<=m;i++)
ans[0][i]=0;
for(int i=1;i<=n;i++)
{
cin>>wei[i]>>val[i];
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
if(j>=wei[i])
ans[i][j]=max(ans[i-1][j],ans[i-1][j-wei[i]]+val[i]);
else
ans[i][j]=ans[i-1][j];
}
}
cout<<ans[n][m]<<endl;
}
2.状态压缩写法,状态转移方程为ans[i][j]=max(ans[i-1][j],ans[i-1][j-wei[i]]+