uva 624 CD (0/1背包)

简介: 点击打开链接uva 624 思路: 0/1背包 分析: 1 题目要求的是最大的时间,并且输出选择所选的磁带 2 要求最大的时间很容易,关键是怎么求所选的磁带。

点击打开链接uva 624

思路: 0/1背包
分析:
1 题目要求的是最大的时间,并且输出选择所选的磁带
2 要求最大的时间很容易,关键是怎么求所选的磁带。正常求0/1背包我们都是直接优化成一维即dp[j] = max(dp[j] , dp[j-v[i]]+w[i]),但是一维的话是不能记录路径的,所以这题应该利用二维即dp[i][j] = max(dp[i-1][j] , dp[i-1][j-v[i]]+w[i])
3 那么利用了二维之后,假设我们求出了ans = dp[n][sum],那么我们可以通过回溯法求出路径。如果dp[n-1][sum] != dp[n][sum]说明取了第n个,那么到dp[n-1][sum-v[i]]......

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 25;
const int MAXN = 10000;
int n , sum , v[N];
int dp[N][MAXN];

void solve(){
    memset(dp , 0 , sizeof(dp));
    int ans = 0;
    for(int i = 1 ; i <= n ; i++){
        for(int j = sum ; j >= 0 ; j--){
            dp[i][j] = dp[i-1][j];//注意这里要赋值
            if(j >= v[i])
               dp[i][j] = max(dp[i][j] , dp[i-1][j-v[i]]+v[i]);
        }
    }
    int i = n , j = sum;
    while(i&&n){
        if(dp[i-1][j] != dp[i][j]){ 
            printf("%d " , v[i]);
            j -= v[i];
        }
        i--; 
    }
    printf("sum:%d\n" , dp[n][sum]);
}

int main(){
    while(scanf("%d" , &sum) != EOF){
         scanf("%d" , &n);
         for(int i = 1 ; i <= n ; i++) 
             scanf("%d" , &v[i]); 
         solve();
    }
    return 0;
}



目录
打赏
0
0
0
0
15
分享
相关文章
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
poj 1976 A Mini Locomotive(0/1背包)
点击打开链接poj 1976 思路: 0/1背包 分析: 1 题目给定n个数,要求三段连续的m个数之和最大 2 假设n个数是num[1],num[2],num[3].
880 0
hdu2955--01背包
1、Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955 正确的方程是:f[j]=max(f[j],f[j-q[i].money]*q[i].v) 其中,f[j]表示抢j块大洋的最大的逃脱概率,条件是f[j-q[i].money]可达,也就是之前抢劫过; 始化为:f[0]=1,其余初始化为-1 (抢0块大洋肯定不被抓嘛)#i
1197 0
【OJ】DP 01背包 记忆化搜索 O(nW)
题目链接:点击打开链接 /* 01背包 记忆化搜索 O(nW) */ #include #include #include #define MAX_N 101 #define MAX_W 3001 using namespace std;//最多有3000元,dp[...
928 0
uva 147 Dollars(完全背包)
点击打开链接uva 147 思路: 完全背包 分析: 1 很明显裸的完全背包,注意一个地方就是输入的值不一定是小数点只有2位,这边我们应该分成两部分输入,最后注意输出即可 代码: #include #include #inclu...
963 0
【HDU 4547 CD操作】LCA问题 Tarjan算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4547 题意:模拟DOS下的cd命令,给出n个节点的目录树以及m次查询,每个查询包含一个当前目录cur和一个目标目录tar,返回从cur切换到tar所要使用的cd命令次数: 注意这里的cd命令是简化版,只能进行如下两种操作:   1.
988 0
uva 652---Eight Poj 1077 ---Eight zoj 1217---Eight (八数码解法2)
点击打开链接uva 652 点击打开链接hdu 1043 点击打开链接zoj 1217                                                              八数码解法2 解题整体思路 ...
1121 0
uva 652---Eight Poj 1077 ---Eight zoj 1217---Eight (八数码解法1)
点击打开链接uva 652 点击打开链接hdu 1043 点击打开链接zoj 1217                                                              八数码解法1 解题整体思路 ...
1313 0
uva 652---Eight Poj 1077 ---Eight zoj 1217---Eight (八数码解法3)
点击打开链接uva 652 点击打开链接hdu 1043 点击打开链接zoj 1217                                                              八数码解法3 解题整...
1296 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等