ACM动态规划问题简易模板(C++可编译)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; }