您的位置:首页 > 其它

UVA 624 CD (01 背包)

2015-09-08 21:35 309 查看
【题目链接】:click here~~

代码:

/*  
* Problem: UVA No.624
* Running time: 0MS  
* Complier: C++  
* Author: javaherongwei 
* Create Time: 21:25 2015/9/8 星期二
* 【题意】你要录制时间为N的带子,给你一张CD的不同时长的轨道,求总和不大于N的录制顺序
  【思路】要求总和最接近N,可以用01背包思想,把不同的轨道当成背包体积,求那么问题可以
  转换为求总体积不超过N的最大价值,用二维数组记录选过的数即可
*/  
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

const int N=10005;
int volume
;
int dp
;
bool vis[25]
;

int main()
{
    int n,V;
    while(scanf("%d%d",&V,&n)!=EOF)
    {
        memset(volume,0,sizeof(volume)); //input
        memset(dp,0,sizeof(dp));
        memset(vis,0,sizeof(vis));     // vis true or not
        for(int i=0; i<n; ++i)
        {
            scanf("%d",&volume[i]);
        }
        for(int i=0; i<n; ++i)
        {
            for(int v=V; v>=volume[i]; --v)
            {
                if(dp[v]<=dp[v-volume[i]]+volume[i]) // !=
                {
                    dp[v]=dp[v-volume[i]]+volume[i];
                    vis[i][v]=1; //vis true
                }
            }
        }
        for(int i=n-1,j=V; i>=0; i--)
        {
            if(vis[i][j]) // if vis true,print the number
            {
                printf("%d ",volume[i]);
                j-=volume[i];
            }
        }
        printf("sum:%d\n",dp[V]);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: