- symo 的博客
常用算法模版
- 2024-12-4 17:37:40 @
数学
常用算法模版
判断n是否为素数 :
bool is_prime(int n) {
if (n <= 1) return false;
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) return false;
}
return true;
}
求最大公约数:
int gcb(int a,int b){
return b==0 ? a:gcb(b,a%b);
}
最长递增子序列
for ( j=1; j<len; j++ )
for ( i=0; i<j; i++ )
if ( a[j]>a[i] && dp[j]<dp[i]+1 )
dp[j] = dp[i]+1;
X的二进制长度
int BitLength(int x)
{
int d = 0;
while (x > 0) {
x >>= 1;
d++;
}
return d;
}
质因数分解
int reduce(int prime[],int pn,int n,int rest[])
{
int i,k=0;
for(i=0;i<pn;i++)
{
if (n==1) break;
if (prime[i]*prime[i]>n) {rest[k++]=n;break;}
while(n%prime[i]==0)
{
n/=prime[i];
rest[k++]=prime[i];
}
}
return k;
}
任意进制转换
void conversion(char s[],char s2[],long d1,long d2)
{
long i,j,t,num;
char c;
num=0;
for (i=0;s[i]!='\0';i++)
{
if (s[i]<='9'&&s[i]>='0') t=s[i]-'0'; else t=s[i]-'A'+10;
num=num*d1+t;
}
i=0;
while(1)
{
t=num%d2;
if (t<=9) s2[i]=t+'0'; else s2[i]=t+'A'-10;
num/=d2;
if (num==0) break;
i++;
}
for (j=0;j<i/2;j++)
{c=s2[j];s2[j]=s[i-j];s2[i-j]=c;}
s2[i+1]='\0';
}
大数加法
string solve(string s, string t) {
// write code here
if(s.size()<t.size())
{
string temp=s;
s=t;
t=temp;
}
int len1=s.size();
int len2=t.size();
int num1,num2,flag=0,sum;
while(len1>0)
{
num1=s[len1-1]-'0';
if(len2>0)
num2=t[len2-1]-'0';
else
num2=0;
sum=num1+num2+flag;
s[len1-1]=sum%10+'0';
flag=sum/10;
len1--;
len2--;
}
if(flag==1)
s="1"+s;
return s;
}
字符串查找
int strfind(char str[],char key[])
{
int l1,l2,i,j,flag;
l1=strlen(str);
l2=strlen(key);
for (i=0;i<=l1-l2;i++)
{
flag=1;
for (j=0;j<l2;j++)
if (str[i+j]!=key[j]) {flag=0;break;}
if (flag) return i;
}
return -1;
}
背包问题
给你n个价值的东西及背包容量c,然后知道n个东西的价值v[i]以及重量w[i] 求在背包容量范围为内可以装的最多的价值。
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
int w[1005],v[1005],dp[1005];
int main()
{
int i,j,tcase,n,c;
scanf("%d",&tcase);
while(tcase--)
{
scanf("%d%d",&n,&c);
for(i=0;i<n;i++)
{
scanf("%d",&v[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&w[i]);
}
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
for(j=c;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
printf("%d\n",dp[c]);
}
return 0;
}