100 #P1411. *【背包练习】打牌
*【背包练习】打牌
Description
【题意】(数据没错,验证byscy20231023)一副牌,有n(1<N<=130)张牌,但少了几张,告诉你牌的总重量tw和每张牌的重量wi,把缺少的牌找出来。
【输入格式】
第一行,总重量tw
第二行,n张牌
接下来n行,每张牌重量wi(1<=wi<=1000)
【输出格式】
如果无解,则输出“0”;如果有多解,则输出“-1”;否则,按照升序输出丢失的牌的编号,相邻两个数之间用一个空格隔开。
【输入样例】
270
4
100
110
170
200
【输出样例】
2 4
Hint
#include<bits/stdc++.h>
using namespace std;
const int N=151;
int a[N],f[N*1000],rt[N*1000];
int main()
{
int m;scanf("%d",&m);
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
memset(f,0,sizeof(f));f[0]=1;
for(int i=1;i<=n;i++)
for(int j=m;j>=a[i];j--)if(f[j]<=1)
f[j]+=f[j-a[i]];
if(f[m]>1) puts("-1");
else if(f[m]==0) puts("0");
else
{
int now=m;
for(int i=1;i<=n;i++)
{
if(f[now-a[i]]&&now-a[i]>=0) now-=a[i];
else printf("%d ",i);
}
}
return 0;
}
</p>