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&#44;0&#44;sizeof(f));f[0]=1;
for(int i=1;i&lt;=n;i++)
    for(int j=m;j&gt;=a[i];j--)if(f[j]&lt;=1)
        f[j]+=f[j-a[i]];
    
if(f[m]&gt;1) puts("-1");
else if(f[m]==0) puts("0");
else
{
    int now=m;
    for(int i=1;i&lt;=n;i++)
	{
        if(f[now-a[i]]&amp;&amp;now-a[i]&gt;=0) now-=a[i];
        else printf("%d "&#44;i);
    }
}
return 0;

}

</p>