写了些运用01背包,完全背包的题
主要就是找状态方程,两种主要差别就是j一个是反着循环,一个是正着来
最长上升子序列的动态规划,也是运用dp
#include<bits/stdc++.h>
using namespace std;
int a[100],dp[100];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
dp[i]=1;
for(int j=1;j<i;j++)
{
if(a[j]<a[i]){
dp[i]=max(dp[i],dp[j]+1);
}
}
printf("dp[%d]=%d\n",i,dp[i]);
}
return 0;
}
二维费用的背包问题,不只容量有限制,还有别的限制。
例如,两层for循环,一层是体积限制,一层容量限制,体积b,容量c,就是比普通限制多层循环
cin >> a >> b >> c;
for(int i = 0; i < a; i ++ ) cin >> v[i] >> t[i] >> w[i];
for(int i = 0; i < a; i ++ )
for(int j = b; j >= v[i]; j -- )
for(int k = c; k >= t[i]; k -- )
f[j][k] = max(f[j][k], f[j - v[i]][k - t[i]] + w[i]);
cout << f[b][c] << endl;