UVA 624 CD 【记录路径式的01背包】

刚开始懵逼了,后来才看懂题,像BFS的求某一列中序列和问题;

虽然不知道能不能用DFS解,但是很明显的01背包问题,就用01背包解决吧;

题意:

你即将开车出远门,当然希望在车上能聆听一些美好的音乐。你的车上只有播放录音带的设备,但是你最喜欢的音乐却都存放在CD上。所以你需要把CD上的音乐转录到录音带上。现在你必须解决的问题是:你的空白录音带长共N分钟,你如何选择CD上的歌使得尽可能的利用录音带的空间。以下是一些此问题的假设:

  • CD上的歌最多不会超过20首。
  • 没有任何一首歌的长度超过N分钟。
  • 要录在录音带上的歌不能重复。
  • 每首歌的长度以一整数表达。
  • N也是一个整数。

你的程式必须找出该放哪些CD上的歌到录音带上(按CD上的顺序),使得录音带空白的空间最小。



#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std ;
const int maxn=10001;
bool vis[maxn][30];
int n , m , a[30],dp[maxn];
int main()
{
	while(cin>>n>>m)
	{
		memset(vis,0,sizeof(vis));  
	    memset(dp,0,sizeof(dp));  
	    for(int i  = 0 ; i < m ;i++)
	    {
	    	cin>>a[i];
		}
		for(int i = 0 ; i < m ;i++)
		{
			for(int j = n ;j>=a[i];j--)
			{
				if(dp[j]<=dp[j-a[i]]+a[i])
				{
					dp[j]=dp[j-a[i]]+a[i];  
				     vis[j][i]=1;  

				}
			}
		}
		for(int i = m-1,j=n;i>=0;i--)
		{
			if(vis[j][i])
			{
				printf("%d ",a[i]);
				j-=a[i];
			}
		}
		printf("sum:%d\n",dp[n]);
	}
	return 0 ;
}
记录路径很麻烦,但是想想就好,另外开一个数组判断是否走过。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kelisita

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值