ACM动态规划问题简易模板(C++可编译)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、0-1背包

#include

#include

//背包问题

/*

测试数据:

输入:

8 23

8 4 5 1 6 6 7 3

7 8 3 3 4 9 6 2

输出:

1 0 1 0 1 0 1 1

*/

int num,c;

int v[10];

int w[10];

int m[10][30];//设m[i][j],则表示在前i个物品中,背包大小是j的情况下,背包所装东西的最大价值

void knapsack()

{

int n=num-1;

int jmax,i,j;

if(w[n]

else jmax=c;

for(i=0;i

m[n][i]=0;

for(i=w[n];i<=c;i++)

m[n][i]=v[n];

for(i=n-1;i>0;i--)

{

if(w[i]

else jmax=c;

for(j=0;j

m[i][j]=m[i+1][j];

for(j=w[i];j<=c;j++)

{

if(m[i+1][j]

m[i][j]=m[i+1][j-w[i]]+v[i];

else

m[i][j]=m[i+1][j];

}

}

m[0][c]=m[1][c];

if(c>=w[0])

{

if(m[0][c]

m[0][c]=m[1][c-w[0]]+v[0];

}

}

void trackback(int *x)

{

int n=num-1;

int i;

for(i=0;i

{

if(m[i][c]==m[i+1][c]) x[i]=0;

else

{

x[i]=1;

c=c-w[i];

}

}

if(m[n][c]>0) x[n]=1;

else x[n]=0;

}

int main()

{

int i,x[10],j;

scanf("%d %d",&num,&c);

for(i=0;i

scanf("%d",&v[i]);

for(i=0;i

scanf("%d",&w[i]);

knapsack();

for(i=0;i<=c;i++) printf("%3d",i);

printf("\n");

for(i=0;i

{

for(j=0;j<=c;j++)

printf("%3d",m[i][j]);

printf("\n");

}

trackback(x);

for(i=0;i

printf("%d ",x[i]);

printf("\n");

return 0;

}

2、KMP算法

#include

#include

using namespace std;

inline void BuildNext(const char* pattern, size_t length, unsigned int* next)

{

unsigned int i, t;

i = 1;

t = 0;

next[1] = 0;

while(i < length + 1)

{

while(t > 0 && pattern[i - 1] != pattern[t - 1])

{

t = next[t];

}

++t;

++i;

if(pattern[i - 1] == pattern[t - 1])

{

next[i] = next[t];

}

else

{

next[i] = t;

}

}

//pattern末尾的结束符控制,用于寻找目标字符串中的所有匹配结果用while(t > 0 && pattern[i - 1] != pattern[t - 1])

{

t = next[t];

}

++t;

++i;

next[i] = t;

}

unsigned int KMP(const char* text, size_t text_length, const char* pattern, size_t pattern_length, unsigned int* matches)

{

unsigned int i, j, n;

unsigned int next[pattern_length + 2];

BuildNext(pattern, pattern_length, next);

i = 0;

j = 1;

n = 0;

while(pattern_length + 1 - j <= text_length - i)

{

if(text[i] == pattern[j - 1])

{

++i;

++j;

//发现匹配结果,将匹配子串的位置,加入结果

if(j == pattern_length + 1)

{

matches[n++] = i - pattern_length;

j = next[j];

}

}

else

{

j = next[j];

if(j == 0)

{

++i;

++j;

}

相关文档
最新文档