Vijos P1071新年趣事之打牌

链接:https://vijos.org/p/107

问题描述

过年的时候,大人们最喜欢的活动,就是打牌了。xiaomengxian不会打牌,只好坐在一边看着。

这天,正当一群人打牌打得起劲的时候,突然有人喊道:“这副牌少了几张!”众人一数,果然是少了。于是这副牌的主人得意地说:“这是一幅特制的牌,我知道整副牌每一张的重量。只要我们称一下剩下的牌的总重量,就能知道少了哪些牌了。”大家都觉得这个办法不错,于是称出剩下的牌的总重量,开始计算少了哪些牌。由于数据量比较大,过了不久,大家都算得头晕了。

这时,xiaomengxian大声说:“你们看我的吧!”于是他拿出笔记本电脑,编出了一个程序,很快就把缺少的牌找了出来。

如果是你遇到了这样的情况呢?你能办到同样的事情吗?


输入文件

第一行一个整数TotalW,表示剩下的牌的总重量。

第二行一个整数N(1<N<=100),表示这副牌有多少张。

接下来N行,每行一个整数Wi(1<=Wi<=1000),表示每一张牌的重量。


输出文件

如果无解,则输出“0”;如果有多解,则输出“-1”;否则,按照升序输出丢失的牌的编号,相邻两个数之间用一个空格隔开。

 

输入样例

270

4

100

110

170

200


输出样例

2 4


思路

枚举所有会出现的情况,然后查找


代码

#include <iostream>  
#define W 110002  
#define N 102  
using namespace std;  
int w,n,v,f[W]={1},c[W],ans[N],a[N];  
int main()  
{  
    cin>>w>>n;  
    for(int i=1;i<=n;i++)  
    {  
      cin>>a[i];  
      for(int j=w;j>=a[i];j--)  
          if(f[j-a[i]])  
	        {  
	          f[j]+=f[j-a[i]];  
	          if(!c[j])  
	            c[j]=i;  
	        }  
    }  
    if(!f[w]) 
	   cout<<"0\n";  
    if(f[w]>1)  
	   cout<<"-1\n";  
    if(f[w]==1)  
    {  
        v=w;  
        while(v)  
        {  
            ans[c[v]]=1;  
            v-=a[c[v]];  
        }  
        for(int i=1;i<=n;i++)  
            if(!ans[i])  
               cout<<i<<' ';  
        cout<<endl;  
    }  
    return 0;  
}  




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值