一道01背包裸题,一道LCS裸题,原谅学渣怕算法考不来,写一写练熟练度,当然POJ那道裸的01背包开二维数组MLE了,只不过算法书上基本都是二维数组的形式,所以也就这么写了。。。只是贴个代码,来玩一玩罢了。。。还有,我发现我的solve也一直是拼错的诶= =|||
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[20005];
int n,m;
int w[20005],d[20005];
int main()
{
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
{
cin>>w[i]>>d[i];
}
// memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
for(int j=m;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+d[i]);
}
}
cout<<dp[m]<<endl;
}
return 0;
}//AC的版本
<pre name="code" class="cpp">/*3624のMLE*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int dp[3403][12881];
int w[3403], d[3403];
int slove(int n,int m,int w[],int d[])
{
for(int i=0;i<=n;i++)
dp[i][0]=0;
for(int j=0;j<=m;j++)
dp[0][j]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(j<w[i])
dp[i][j]=dp[i-1][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+d[i]);
return dp[n][m];
}
int main()
{
while(cin>>n>>m)
{
for(int i=1;i<=n;i++)
cin>>w[i]>>d[i];
int ans=slove(n,m,w,d);
cout<<ans<<endl;
}
return 0;
}//适用于算法书上的版本。。。
/*LCS算法书版本*/
<pre name="code" class="cpp">#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
char s1[1005],s2[1005];
int l[1005][1005];
int len1,len2;
int slove(char s1[],int len1,char s2[],int len2)
{
for(int j=0;j<=len2;j++)
l[0][j]=0;//初始化第0行
for(int i=0;i<=len1;i++)
l[i][0]=0;//初始化第0列
for(int i=1;i<=len1;i++)
for(int j=1;j<=len2;j++)
if(s1[i-1]==s2[j-1])
{
l[i][j]=l[i-1][j-1]+1;
}
else if(l[i][j-1]>=l[i-1][j])
{
l[i][j]=l[i][j-1];
}
else
{
l[i][j]=l[i-1][j];
}
return l[len1][len2];
}
int main()
{
while(cin>>s1>>s2)
{
len1=strlen(s1);
len2=strlen(s2);
int ans=slove(s1,len1,s2,len2);
cout<<ans<<endl;
}
return 0;
}