【动态规划】Gentlemen

原创 2012年03月30日 10:03:50

1244. Gentlemen

Time Limit: 0.5 second
Memory Limit: 16 MB
Let's remember one old joke:
Once a gentleman said to another gentleman:
— What if we play cards?
— You know, I haven't played cards for ten years…
— And I haven't played for fifteen years…
So, little by little, they decided to resurrect their youth. The first gentleman asked a servant to bring a pack of cards, and before starting playing out weighed in his hand the pack.
— It seems to me, one card is missing from the pack… — he said and gave the pack to the other gentleman.
— Yes, the nine of spades, — the man agreed.
An incomplete pack of cards is given. The program should determine which cards are missing.

Input

The first line contains a positive integer, which is the weight in milligrams of the given incomplete pack. The second line contains an integer N, 2 ≤ N ≤ 100 — the number of cards in the complete pack. In the next N lines there are integers from 1 to 1000, which are the weights of the cards in milligrams. It's guaranteed that the total weight of all cards in the complete pack is strictly greater than the weight of the incomplete pack.

Output

If there is no solution, then output the single number 0. If there are more than one solutions, then you should write −1. Finally, if it is possible to determine unambiguously which cards are missing in the incomplete pack as compared to the complete one, then output the numbers of the missing cards separated with a space in ascending order.

Samples

input output
270
4
100
110
170
200
2 4
270
4
100
110
160
170
-1
270
4
100
120
160
180
0


题目比较简单,但是维护方案比较麻烦,因为空间限制是16MB。。。网上的题解方法是一些钻空子的方法,比较巧妙。。

但是其实我的钻空子更钻我觉得。


题目可以看出,答案之和f[i][j]是等于零,还是等于一,还是大于一有关,输出方案只和f[i][j]是否等于一有关。

因此用不着long int,我开了最小的unsigned char。

如果f[i][j]大于255了,就把它设为是255,反正也不会影响答案。


这道题我用了GCD,来缩小规模,可能效果不好就是了。。对于小数据可能有用,但是大数据我猜一定起了反效果,最大公约数大于1的可能性太小了、、


#include <algorithm>
#include <cstdlib>
#include <cstdio>
using std::sort;
long weight;
long n;

struct node
{
	long w;
	long i;	
};
long card[110];
unsigned char f[101][100001];
long ans[110];
long top = 0;

bool cmpr(const node& a,const node& b)
{
	return a.w < b.w;
}

inline long GCD(long a,long b)
{
	while (b)
	{
		long tmp = b;
		b = a%b;
		a = tmp;
	}	
	return a;
}

int main()
{
	scanf("%ld%ld",&weight,&n);
	
	scanf("%ld",card+1);
	weight -= card[1];	
	long gg = card[1];
	for (long i=2;i<n+1;i++)
	{
		scanf("%ld",card+i);
		if (card[i])
		{
			gg = GCD(gg,card[i]);
			weight -= card[i];	
		}
	}
	weight = -weight;
	if (weight == 0)
	{
		printf("-1");//???
		return 0;
	}
	gg = GCD(gg,weight);
	for (long i=1;i<n+1;i++)
		card[i] /= gg;
	weight /= gg;
	
	f[1][0] = 1;
	for (long i=1;i<n+1;i++)
	{
		for (long j=0;j<weight+1;j++)
			f[i+1][j] = 0;
		for (long j=0;j<weight+1;j++)
		{
			if (j+card[i] < weight+1)
			{
				if (f[i+1][j+card[i]]+f[i][j] > 255)
					f[i+1][j+card[i]] = 255;
				else 
					f[i+1][j+card[i]] += f[i][j];
			}
			if (f[i+1][j] + f[i][j] > 255)
				f[i+1][j] = 255;
			else
				f[i+1][j] += f[i][j];
		}
	}
	
	if (f[n+1][weight] == 0)
		printf("0");
	else if (f[n+1][weight] > 1)
		printf("-1");
	else
	{
		long j = weight;
		for (long i=n+1;i>1;i--)
		{
			if (f[i-1][j-card[i-1]])
			{
				ans[++top] = i-1;
				j = j-card[i-1];
			}
		}
		for (long i=top;i>0;i--)
			printf("%ld ",ans[i]);
	}
	return 0;
} 


相关文章推荐

动态规划,建桥问题代码

  • 2017年11月09日 17:06
  • 340KB
  • 下载

动态规划 源码

  • 2017年10月31日 10:51
  • 12KB
  • 下载

动态规划----数塔问题

动态规划(Dynamic Programming,简称DP)是通过组合子问题的解来解决问题的。 注意这里的programming不是指编程,而是指一种规划 适用于子问题不是独立的情况,...

算法之动态规划

  • 2016年01月05日 07:48
  • 5KB
  • 下载

增强学习(三)----- MDP的动态规划解法

上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值。(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的...
  • zz_1215
  • zz_1215
  • 2015年03月08日 22:17
  • 18740

逐时段摄动动态规划poa

  • 2015年11月28日 14:49
  • 32KB
  • 下载

动态规划集合划分

  • 2016年12月08日 23:13
  • 15KB
  • 下载

动态规划之最长递增子序列(Longest Increasing Subsequence)

原文地址:http://www.geeksforgeeks.org/dynamic-programming-set-3-longest-increasing-subsequence/ We have...

动态规划最长公共子序列

  • 2016年04月24日 15:35
  • 589B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【动态规划】Gentlemen
举报原因:
原因补充:

(最多只允许输入30个字)