UVa12563_劲歌金曲(动态规划_01背包变形)

参考文章:http://blog.csdn.net/u013480600/article/details/40376143

自己写的AC代码如下:

#include<bits/stdc++.h>
using namespace std;
const int maxt = 50 * 3 * 60 + 5;
typedef struct { 
	int n;
	int len;
}Node;
Node F[maxt];
Node best(Node& x, Node& y){
	if(x.n < y.n) return y;
	else if(x.n == y.n && x.len<=y.len) return y;
	else return x;
}
int main() {
	int T;
	scanf("%d", &T);
	int count = 0;
	while(T--) {
		int n, t0, t;
		scanf("%d%d", &n, &t0);
		memset(F, 0, sizeof(F)); 
		int max_t;
		max_t = min(maxt, t0);
		for(int i = 1; i <= n; i++) {
			scanf("%d", &t);
			for(int j = max_t-1; j>= 0; j--) {
				if(i==1){
					F[j].n = 0; 
					F[j].len = 0;
				}else {
					F[j] = F[j];
				}
				if(j >= t) {
					Node tmp;
					tmp.n = F[j-t].n + 1;
					tmp.len = F[j-t].len + t;
					F[j] = best(F[j], tmp);
				} 
			}
		}
		printf("Case %d: %d %d\n", ++count, F[t0-1].n+1, F[t0-1].len+678);
	} 
	return 0;
}
 


初始版本:

#include<bits/stdc++.h>
using namespace std;
//状态F[i][j]:前i首歌曲所达到的最优状态
//这个最优状态包括两个小的最优状态
//1.最大歌曲数 、 2.最长歌曲时间 
//状态转移方程:F[i][j] = 最优(F[i-1][j], F[i-1][j-t[i]] + t[i]); 
const int maxn = 50 + 5;
const int maxt = 50 * 3 * 60;
int t[maxn];//每首歌曲时间
typedef struct {//状态节点定义 
	int n;//1.最大歌曲数 
	int len;//2.最长歌曲时间 
}Node;
Node F[maxn][maxt]; //状态节点 
Node best(Node& x, Node& y){
	if(x.n < y.n) return y;
	else if(x.n == y.n && x.len<=y.len) return y;
	else return x;
}
int main() {
	int T;
	cin >> T;
	int count = 0;
	while(T--) {
		int n, t0;
		cin >> n >> t0;
		//F数组的初始化;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值