uva 624 CD

来源:互联网 发布:网络设备监控软件 开源 编辑:程序博客网 时间:2024/05/18 16:14

背包问题,要求把路径打印出来。

最后一组测试数据上跟答案有点不同,因为该数据存在两种方案。

题目没说,但是在有多种方案时随便打印一种即可的。

#include <stdio.h>#include <string.h>int main(){int N, t, i, j, sum;int dp[2001], a[22];;while(scanf("%d%d", &N, &t) != EOF){memset(dp, -1, sizeof(dp));dp[0] = 0;for(i = 0; i < t; i++){scanf("%d", &a[i]);}for(i = t - 1; i >= 0; i--){for(j = N; j >= a[i]; j--){if(dp[j - a[i]] != -1 && dp[j] == -1){dp[j] = a[i];}}}while(dp[N] == -1){N--;}int sum = N;while(N){printf("%d ", dp[N]);N -= dp[N];}printf("sum:%d\n", sum);}return 0;}

和测试数据输出一样的代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=2001;int n,m,a[22],dp[maxn];bool vis[maxn][22];int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {memset(vis,0,sizeof(vis));memset(dp,0,sizeof(dp));for(int i=m-1;i>=0;i--)    scanf("%d",&a[i]);for(int i=0;i<m;i++)    for(int j=n;j>=a[i];j--)if(dp[j]<=dp[j-a[i]]+a[i]){    dp[j]=dp[j-a[i]]+a[i];    vis[j][i]=1;}for(int i=m-1,j=n;i>=0;i--){    if(vis[j][i])    {printf("%d ",a[i]);j-=a[i];    }}printf("sum:%d\n",dp[n]);    }    return 0;}


0 0
原创粉丝点击