您的位置:首页 > 其它

【DP】UVA 624 CD 记录路径

2017-08-02 08:52 429 查看
开一个数组p

若dp[i-1][j]<dp[i-1][j-a[i]]+a[i]时就记录下p[j]=a[i];表示此时放进一个轨道

递归输出p

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include<iostream>
#include <algorithm>
using namespace std;
#define MAXN 11111
#include <queue>
#include <vector>
#define IN freopen("in.txt","r",stdin);
int a[30],dp[30][MAXN],p[MAXN];
void out(int x)
{
if(x==0)
return ;
else    out(x-p[x]);
printf("%d ",p[x]);
}
int main()
{
int n,m;
// IN;
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(dp,0,sizeof(dp));
memset(p,0,sizeof(p));
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
for(int i=1; i<=n; i++)
{
for(int j=m; j>0; j--)
{
if(j>=a[i]&&dp[i-1][j]<dp[i-1][j-a[i]]+a[i])
dp[i][j]=dp[i-1][j-a[i]]+a[i],p[j]=a[i];
else
dp[i][j]=dp[i-1][j];
}
}
int i;
for(i=m;i>=0;i--)
if(dp
[i]>dp
[i-1])
break;
out(i);
printf("sum:%d\n",dp
[m]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: