求助,玄关
  • 板块灌水区
  • 楼主GYHL
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/9/28 14:59
  • 上次更新2024/9/28 17:09:32
查看原帖
求助,玄关
1009417
GYHL楼主2024/9/28 14:59

有N枚砝码,各有重量。天平秤物品时砝码放在左边的秤盘上,物品放在右边的秤盘上,如果两边重量刚好相等,天平就会平衡,表示一次成功的称量。

现在有M个物品,各有不同重量。问称量每种物品时,需要的最少砝码数是多少?如果物品的重量不能称量,就输出-1。

例如4个砝码,重量分别是:1, 1, 3, 4。5个物品重量是:2, 4, 5, 8, 20。

需要的答案为:2(2=1+1)、1(4=4)、2(5=1+4)、3(8=1+3+4)、-1(20=?)

输入格式 第1行:1个正整数N,范围[2,100]。

第2行N个整数,每个整数范围[1,100]。

第3行:1个正整数M,范围[2,100]。

第4行M个整数,每个整数范围[1,10000]。

输出格式 M个整数。

输入/输出例子1 输入:

4

1 1 3 4

5

2 4 5 8 20

输出: 2 1 2 3 -1

我的代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[105],m,x,f[10005],ff[105],d[10005];
bool b=false;
void dfs(int sum,int x,int y,int tg){
    d[sum]=1;
	if(b==true)return ;
    if(sum==tg){
        b=true;
        cout<<y<<" ";
        return ;
    }
    if(x==y)return ;
    for(int i=1;i<=n;i++){
        if(b==true)return ;
        if(!ff[i]&&!d[sum+a[i]]){
        	ff[i]=1;
			//if(tg==4&&y==1){
        		//cout<<endl<<i<<" "<<sum<<" "<<x<<" "<<y<<" "<<tg<<endl;
        	//}         	
        	dfs(sum+a[i],x+1,y,tg);
        	ff[i]=0;
        }
        if(b==true)return ;
    }
    if(b==true)return ;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    cin>>m;
    for(int i=1;i<=m;i++){
        cin>>x;
        b=false;
        for(int j=1;j<=n;j++){
            dfs(0,0,j,x);
            memset(d,0,sizeof(d));
            if(b==true)break;
        }
        if(b==false)cout<<-1<<" ";
        memset(d,0,sizeof(d));
    }
    
    return 0;
}

60分

2024/9/28 14:59
加载中...