DP(Dynamic Programmin)
动态规划可以使用递归但是太过于重复计算,我们可以用一个二维数组将已经推导出的结果保存下来。
1.01背包
w表示重量 v表示价值 i表示第i个物品 j是重量
二维数组的递推式为
dp[i+1][j]={ dp[i]][j] (j<w[i])(拿不了可以拿前面的)
{ max(dp[i][j],dp[i][j-w[i]]+v[i]) (可以拿但要与同等重量的去比价值)
2.最长公共子序列
s,t分别为两个字符串
dp[i+1][j+1]={ dp[i]][j] +1(s[i]==t[i])相等在前面的基础上加1
={ max(dp[i+1][j],dp[i][j+1]+v[i])不相等,比较加入该字符或者不要该字符那个最长
3完全背包
在01背包上增加了对物品可以拿多次只要在01背包上来一个计数K
dp[i+1][j]={ dp[i]][j] (j<w[i])(拿不了可以拿前面的)
{ max(dp[i][j],dp[i][j-k*w[i]]+v[i]) (可以拿但要与同等重量的去比价值)
#include <iostream>
#include <algorithm>
using namespace std;
struct bag
{
int vi,wi;
};
int biao[10000];
bag a[10000];
int main()
{
int c,n;
cin >> c>> n;
for(int i=0;i<c;i++)
cin >>a[i].vi>>a[i].wi;
for(int i=0;i<c;i++)
{
for(int j=n;j>=0;j--)
if(j>=a[i].vi)
biao[j]=max(biao[j-a[i].vi]+a[i].wi,biao[j]);
for(int i=0;i<=n;i++)
cout << biao[i]<<' ';
cout << endl;
}
cout << biao[n];
}
#include<iostream>
#include<string>
using namespace std;
int dp[1010][1010];
int main()
{
string s,t;
int n,m;
cin >> n>>m;
cin >>s;
cin>> t;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(s[i]==t[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]);
}
cout <<dp[n][m];
}
#include <iostream>
#include <algorithm>
using namespace std;
struct bag
{
int vi,wi,ci;
};
bag a[10010];
long long int biao[30010];
int main()
{
int n,v;
cin >> n>>v;
for(int i=0;i<n;i++)
cin >>a[i].vi>>a[i].wi>>a[i].ci;
int cnt ,i,j;
for( i=0;i<n;i++)
for(j=v;j>=0;j--)
{
cnt=0;
while(cnt<=a[i].ci&&j>=a[i].vi*cnt)
{
biao[j]=max(biao[j-a[i].vi*cnt]+a[i].wi*cnt,biao[j]);
cnt++;
}
}
cout<< biao[v];
}