01 背包
n个重量与价值分别为w i,vi,的物品;
从中挑选出重量不超过W的物体;
求价值总量的最大值
手打
int dp[maxn+1][maxw+1]
void solve()
{
for(int i=n-1;i>=0;i--)
{
for(int j=0;j<=w;j++)
{
if(j>=w[i]) dp[i][j]=max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]);
else dp[i][j]=dp[i+1][j];
}
}
printf("%d",dp[0][w]);
}
int dp[maxn+1][maxw+1]
void solve()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<=w;j++)
{
if(j>=w[i]) dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);
else dp[i+1][j]=dp[i][j];
}
}
printf("%d",dp[n][w]);
}
最长公共子序列
//3
#include<bits/stdc++.h>
using namespace std;
int dp[10000][10000];
int main()
{
char a[]="abcd";
char b[]="becd";
int n=4,m=4;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i]==b[j])dp[i+1][j+1]=dp[i][j]+1;
else dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
}
}
printf("%d",dp[n][m]);
}
完全背包问题
有n种重量和价值分别为w,v的物体,从这些物品中挑选总重量不超过W 的物品,求挑选的物品价值总量的最大
《这里是可以挑选任意多的物品
#include<bits/stdc++.h>
using namespace std;
int dp[10000][10000];
int main()
{
int n=3;
int W=7;
int w[3]={3,4,2};
int v[3]={4,5,3};
for(int i=0;i<n;i++)
{
for(int j=0;j<=W;j++)
{
if(j<w[i]) dp[i+1][j]=dp[i][j];
else dp[i+1][j]=max(dp[i+1][j-w[i]]+v[i],dp[i][j]);
}
}
printf("%d\n",dp[n][W]);
}//10
一维数组
完全背包
#include<bits/stdc++.h>
using namespace std;
int dp[10000];
int main()
{
int n=3;
int W=7;
int w[3]={3,4,2};
int v[3]={4,5,3};
for(int i=0;i<n;i++)
{
for(int j=w[i];j<=W;j++)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
printf("%d\n",dp[W]);
}//10
#include<bits/stdc++.h>
using namespace std;
int dp[10000];
int main()
{
int n=4;
int W=5;
int w[4]={2,1,3,2};
int v[4]={3,2,4,2};
for(int i=0;i<n;i++)
{
for(int j=W;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
printf("%d\n",dp[W]);
}//7