UVA12563 0-1背包变形
2016-08-08 15:19
239 查看
题目链接点击打开链接
题意:KTV里面有n首歌曲你可以选择,每首歌曲的时长都给出了. 对于每首歌曲,你最多只能唱1遍. 现在给你一个时间限制t (t<=10^9) , 问你在最多t-1秒的时间内可以唱多少首歌曲num , 且最长唱歌时间是多少time (time必须<=t-1)
? 最终输出num+1 和 time+678 即可.
注意: 你需要优先让歌曲数目最大的情况下,再去选择总时长最长的.
分析:题意是在小于t的时间内,选择哪些歌曲可使得所选歌曲数目最多,在此前提下,所选歌曲总时间越长越好。
设DP(i,j)表示“把前i首歌曲装到时间容量为j的背包中的最大总重量(重量包含两个属性:歌曲数目和歌曲长度)”。
状态转移方程 dp[i][j] =max(
dp[i-1][j], 在dp[i-1][j-t[i]]的基础上选择第i首歌后得到的新状态tmp)
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 10000 ;
int a[55] ;
struct song
{
int number ;
int length ;
}S[52][maxn];
bool operator > (const song &A , const song &B)
{
if(A.number == B.number) return A.length > B.length ;
else return A.number > B.number ;
}
int main()
{
//freopen("a.txt" , "r" , stdin) ;
int T , n , t , kase = 0 ;
scanf("%d" , &T) ;
while(T --)
{
scanf("%d%d" , &n , &t) ;
for(int i = 1 ; i <= n ; i++)
scanf("%d" , &a[i]) ;
memset(S , 0 , sizeof(S)) ; //初始化
for(int i = 1 ; i <= n ; i++)
{
for(int j = 0 ; j <= t ; j ++)
{
if(i == 1) { S[i][j].number = 0 ; S[i][j].length = 0; }
else S[i][j] = S[i - 1][j] ;
if(j > a[i]) //注意不能取等于
{
song t ;
t.number = S[i - 1][j - a[i]].number + 1 ;
t.length = S[i-1][j-a[i]].length + a[i] ;
if(t > S[i][j]) S[i][j] = t ;
}
//printf("i=%d j=%d %d %d\n" ,i , j , S[i][j].number , S[i][j].length) ;
}
}
//printf("\n") ;
printf("Case %d: %d %d\n" , ++kase , S
[t].number + 1 , S
[t].length + 678) ;
}
return 0;
}
题意:KTV里面有n首歌曲你可以选择,每首歌曲的时长都给出了. 对于每首歌曲,你最多只能唱1遍. 现在给你一个时间限制t (t<=10^9) , 问你在最多t-1秒的时间内可以唱多少首歌曲num , 且最长唱歌时间是多少time (time必须<=t-1)
? 最终输出num+1 和 time+678 即可.
注意: 你需要优先让歌曲数目最大的情况下,再去选择总时长最长的.
分析:题意是在小于t的时间内,选择哪些歌曲可使得所选歌曲数目最多,在此前提下,所选歌曲总时间越长越好。
设DP(i,j)表示“把前i首歌曲装到时间容量为j的背包中的最大总重量(重量包含两个属性:歌曲数目和歌曲长度)”。
状态转移方程 dp[i][j] =max(
dp[i-1][j], 在dp[i-1][j-t[i]]的基础上选择第i首歌后得到的新状态tmp)
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 10000 ;
int a[55] ;
struct song
{
int number ;
int length ;
}S[52][maxn];
bool operator > (const song &A , const song &B)
{
if(A.number == B.number) return A.length > B.length ;
else return A.number > B.number ;
}
int main()
{
//freopen("a.txt" , "r" , stdin) ;
int T , n , t , kase = 0 ;
scanf("%d" , &T) ;
while(T --)
{
scanf("%d%d" , &n , &t) ;
for(int i = 1 ; i <= n ; i++)
scanf("%d" , &a[i]) ;
memset(S , 0 , sizeof(S)) ; //初始化
for(int i = 1 ; i <= n ; i++)
{
for(int j = 0 ; j <= t ; j ++)
{
if(i == 1) { S[i][j].number = 0 ; S[i][j].length = 0; }
else S[i][j] = S[i - 1][j] ;
if(j > a[i]) //注意不能取等于
{
song t ;
t.number = S[i - 1][j - a[i]].number + 1 ;
t.length = S[i-1][j-a[i]].length + a[i] ;
if(t > S[i][j]) S[i][j] = t ;
}
//printf("i=%d j=%d %d %d\n" ,i , j , S[i][j].number , S[i][j].length) ;
}
}
//printf("\n") ;
printf("Case %d: %d %d\n" , ++kase , S
[t].number + 1 , S
[t].length + 678) ;
}
return 0;
}
相关文章推荐
- UVA 12563 Jin Ge Jin Qu hao(01背包变形:两个背包内容)
- uva 12563 Jin Ge Jin Qu hao (01背包变形)
- UVA 12563 劲歌金曲(0-1背包变形~)
- UVA 12563 Jin Ge Jin Qu hao 01背包变形
- uva 12563(动态规划起步第三天 01背包变形)
- UVA12563 0-1背包变形
- UVA 12563 Jin Ge Jin Qu hao(01背包变形:两个条件最优化)
- Jin Ge Jin Qu hao UVA - 12563 (0-1背包变形)
- uva12563(01背包变形,多条件最优解)
- UVa 12563 劲歌金曲(0-1背包)
- 01背包,恰好装满(劲歌金曲,uva 12563)
- Jin Ge Jin Qu hao UVA - 12563(背包dp)
- UVA 10313(完全背包变形)
- UVa - 12563 - Jin Ge Jin Qu hao(01背包,动态规划)
- 紫书动规 例题9-5 UVA - 12563 Jin Ge Jin Qu hao dp-01背包
- UVA12563 Jin Ge Jin Qu hao(背包问题)
- UVa 1213 (01背包变形) Sum of Different Primes
- UVA12563 0-1背包 (一位数组)
- UVA12563 01背包
- UVA-12563 01背包