1 条题解

  • 0
    @ 2026-1-31 22:52:31

    C :

    #include "stdio.h"
    int n,m;
    int a[100],f[1000001];
    int main()
    {
    	int i,j;
    	int flag;
    	scanf("%d%d",&m,&n);
    	for(i=0;i<n;i++)
    		scanf("%d",&a[i]);
    	f[0]=1;
    	for(i=0;i<n;i++)
    	{
    		for(j=m;j>=a[i];j--)
    			if(f[j-a[i]])
    				f[j]++;
    	}
    	if(!f[m])
    		printf("0\n");
    	else if(f[m]>1)
    		printf("-1\n");
    	else
    	{
    		flag=1;
    		for(i=0;i<n;i++)
    		{
    			if(m<a[i]||f[m-a[i]]==0)
    			{
    				if(flag)
    				{
    					printf("%d",i+1);
    					flag=0;
    				}
    				else
    					printf(" %d",i+1);
    			}
    			else 
    				m-=a[i];
    		}
    	}
    	return 0;
    }
    

    C++ :

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    int totalw,n,w[101],f[1000001]={0};
    int p[1000001]={0};
    int work();
    int main()
    {
    	//freopen("bag.in","r",stdin);
    	//freopen("bag.out","w",stdout);
    	work();
    	return 0;
    }
    int work()
    {
    	int tot=0;
    	cin>>totalw;
    	cin>>n;
    	for(int i=1;i<=n;i++) 
    	{
    		cin>>w[i];
    		tot+=w[i];
    	}
    	tot-=totalw;
    	f[0]=1;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=tot;j>=w[i];j--)
    		{
    			if(f[j]==0) p[j]=i;	//不管f[j]的前一个点是否为0,p[j]记录的是第一次达到j的物品		
    			f[j]=f[j]+f[j-w[i]];			
    			if(f[tot]>1)
    			{
    				cout<<"-1"<<endl;
    				return 0;				
    			}							
    		}
    	}	
    	if(f[tot]==0)
    	{
    		cout<<0<<endl;
    		return 0;
    	}
    	queue<int> q;
    	int i=tot;
    	int a[101],len=0;
    	while(i>0)
    	{
    		len++;
    		a[len]=p[i];
    		i=i-w[p[i]];
    	}
    	for(int i=len;i>1;i--)cout<<a[i]<<' ';
    	cout<<a[1]<<endl;
    	return 0;
    }
    

    信息

    ID
    2212
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者