UVA 624【01背包】(输出路径)

题目链接:https://vjudge.net/contest/103424#problem/D

题目大意:

你要录制时间为N的带子,给你一张CD的不同时长的轨道,求总和不大于N的录制顺序

分析:

01背包问题,需要注意的是如何将路径输出。

#include <iostream>  
#include <cstdio>  
#include <string.h>  
using namespace std;  
  
int dp[2001], tim[22];  
int n;  
int main()  
{  
    int t;  
    while( scanf("%d",&n)!=EOF )  
    {  
        scanf("%d",&t);  
        int i,j;  
        for( i=0; i<t; i++)  
            scanf("%d",&tim[i]);  
        memset( dp, -1, sizeof( dp));  //-1表示无法组成该数字  
        dp[0]=0;      //先将0初始化  
        for( i=t-1; i>=0; i--)   //逆序为了后面能正向打印方案  
        {  
            for( j=n; j>=tim[i]; j--)  
                if( dp[j-tim[i]]!=-1&& dp[j]==-1 )     //要求dp[j]==-1是如果已经有组成方案则不再更新,否则会出错  
                {  
                    dp[j] =tim[i];   //dp[i]的值为组成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;  
}  

2018-04-28

猜你喜欢

转载自www.cnblogs.com/00isok/p/8969860.html