UVA-624 dp专题A
Posted studyshare777
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA-624 dp专题A相关的知识,希望对你有一定的参考价值。
题目描述:
选CD填充时间,使CD所占总和尽可能大。
在总的时间内选尽可能大的。那么可以看成CD所占的时间是它的费用,也是它的价值。费用不超总时间。就是01背包了,还要选哪个,那就要记录一下路径。记录方法参照网上的博客,用二维数组path记录。最后可以用栈反着打印一下结果。
代码:
#include<stdio.h> #include<stack> #include<cstring> #define max(x,y) x>y?x:y; using namespace std; int main() { int m,n; while(scanf("%d%d",&m,&n)!=EOF) { int v[n+6]; int a[m+6]; bool path[n+6][m+6]; memset(path,false,sizeof(path)); memset(a,0,sizeof(a)); memset(v,0,sizeof(v)); for(int i=0;i<n;i++) scanf("%d",&v[i]); for(int i=0;i<n;i++) { for(int j=m;j>=v[i];j--) { if(a[j-v[i]]+v[i]>=a[j]) { a[j]=a[j-v[i]]+v[i]; path[i][j]=true; } } } stack<int>ans; int k=m; for(int i=n-1;i>=0;i--) { if(path[i][k]&&k>=0) { ans.push(v[i]); k-=v[i]; } } //反着输出 while(!ans.empty()) { int b=ans.top(); printf("%d ",b); ans.pop(); } printf("sum:%d ",a[m]); } return 0; }
以上是关于UVA-624 dp专题A的主要内容,如果未能解决你的问题,请参考以下文章