//快乐
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
int n;
scanf("%d",&n);
int gethappy[n]={0},losspow[n]={0};
for(int i=0;i<n;i++) scanf("%d",&gethappy[i]);
for(int i=0;i<n;i++) scanf("%d",&losspow[i]);
int dp[n+1][1999]={0};//记得初始化
for(int j=0;j<1999;j++)//初始化
{
if(j>=losspow[0])//一旦j足够我学了就学进去
{
dp[0][j]=gethappy[0];
}
else
{
dp[0][j]=0;
}
}
//上面全是第一行,所以这里i初始化为1,从第二行开始
for(int i=1;i<n;i++)
{
for(int j=0;j<1999;j++)
{
if(losspow[i]>j)//如果精力不够我学新的
dp[i][j]=dp[i-1][j];
else
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-losspow[i]]+gethappy[i]);
}
}
}
printf("%d\n",dp[n-1][1998]+1);//记得加1
return 0;
}
//01背包问题
#include <iostream>
#define MAXN 1005
using namespace std;
int v[MAXN]; // 体积
int w[MAXN]; // 价值
int f[MAXN][MAXN]; // f[i][j], j体积下前i个物品的最大价值
int main()
{
int n, m;
cin >> m >> n;
for(int i = 1; i <= n; i++)
cin >> v[i] >> w[i];
for(int i = 1; i <= n; i++)//n是数量
for(int j = 1; j <= m; j++)//m是容量
{
// 当前背包容量装不进第i个物品,则价值等于前i-1个物品
if(j < v[i])
f[i][j] = f[i - 1][j];
// 能装,需进行决策是否选择第i个物品
else
f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
}
cout << f[n][m] << endl;
return 0;
}
//最长上升子序列长度
#include <iostream>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
while(n!=0)
{
int a[n+1];
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int dp[n+1]={0};
for(int i=1;i<=n;i++)
{
dp[i]=1;//长度最小值为1
for(int j=1;j<i;j++)//在i前面
{
if(a[i]>a[j])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,dp[i]);
printf("%d\n",ans);
scanf("%d",&n);
}
return 0;
}
//最长公共子序列
#include <iostream>
#include <string.h>
using namespace std;
int dp[1005][1005];
int main()
{
char s1[1005],s2[1005];
cin>>s1>>s2;
int l1=strlen(s1),l2=strlen(s2);
for(int i=1;i<=l1;i++)
{
for(int j=1;j<=l2;j++)
{
if(s1[i-1]==s2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
cout<<dp[l1][l2];
return 0;
}