点击打开链接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;
}
分享到:
相关推荐
UVa1308/LA2572 Viva Confetti 测试数据
UVa1308/LA2572 Viva Confetti 测试数据 和 用python写的画图可视化分析数据的脚本
UVa1318/LA2797 Monster Trap 测试数据 和 用python写的画图可视化分析数据的脚本
UVa1318/LA2797 Monster Trap 测试数据,方便debug
UVa1446/LA4640 Origami Through-Hole测试数据
UVA 499 Solution in C/ C++
python从入门到精通视频将复杂的编程概念分解成简单的步骤,简单易懂。作者通过多年的教学经验精心挑选出了最有特点的例子,手把手地实例教学...链接:https://pan.baidu.com/s/1UmhbQzDKMjFNbozuqX1UVA 提取码:tkv6
1.Uva_base的编译 在编译球队时,则需要在当前球队文件夹下打开终端输入执行以下命令(以下命令都是在root下执行的): ./configure make clean make 如果运行Uva_base后,出现球员越界或掉线的情况,就重新...
UVa1318/LA2797 Monster Trap 《训练指南》代码仓库上Rujia Liu的源代码
UVA109的题解,经测试完全正确,还附有题解。
uva272
包含UVA在线OJ系统的绝大部分的示例代码,并都已AC,可在刷题时参考
有uva刘汝佳文件夹的50道题解,从数据结构开始,以后慢慢上传
机器学习1(UvA,2018/19) 第一学期,第二学期讲师:Rianne van den Berg博士自然语言处理1(UvA,2018/19) 第一学期,第二学期讲师:叶卡捷琳娜·舒托娃(Ekaterina Shutova)博士网站: : 信息检索1(UvA,2018...
UVa1308/LA2572 Viva Confetti 用python写的画图可视化分析数据的脚本
UVa1318/LA2797 Monster Trap 用python写的画图可视化分析数据的脚本,方便debug
uva最全ac代码
UVa在我看来是比较全的一个题解,希望能帮助大家。欢迎下载。
uva531最长公共子序列问题水题,应用简单的dp即可ac有更快速的方法欢迎讨论
测试数据