东华oj进阶30 盾神与砝码称重(TLE)

文章描述了一道关于利用给定的n个砝码和已知重量的m种物品,通过天平进行称重的问题。作者提供了一段C++代码,采用深度优先搜索(DFS)和剪枝策略来判断每个物品能否被正确称出。

问题:30 盾神与砝码称重

问题描述:

有一天,他在宿舍里无意中发现了一个天平!这个天平很奇怪,有n个完好的砝码,但是没有游码。盾神为他的发现兴奋不已!于是他准备去称一称自己的东西。他准备好了m种物品去称。神奇的是,盾神一早就知道这m种物品的重量,他现在是想看看这个天平能不能称出这些物品出来。但是盾神稍微想了1秒钟以后就觉得这个问题太难了,于是就丢给了你。

   注意:砝码可以和物品一起放在天平的同一边。

输入说明 :

第一行为两个数,n和m。
  第二行为n个数,表示这n个砝码的重量。
  第三行为m个数,表示这m个物品的重量。

  1<=n<=24, 1<=m<=10.

输出说明 :

输出m行,对于第i行,如果第i个物品能被称出,输出YES否则输出NO。

输入范例 :

4 3
10 7 2 19
6 5 11

输出范例 :

NO
YES
YES

思路:

按常规思路来的,但是又TLE了
已经尽我所能剪枝咯

代码实现:

#include<bits/stdc++.h>
using namespace std;

int n,m;
int *fama,*item;
//砝码是否被用中
bool *isUsing;
bool *res;
//剩余砝码总重量
int twFama=0;

void DFS(int k,int l,int iw,int fw)
{
    if(res[l]==true) return;
    else if(item[l]+iw==fw)
    {
        res[l]=true;
        return;
    }
    //物品那边的重量超过砝码那边和剩余砝码总重量之和 或 砝码那边超过物品那边和剩余砝码总重量之和
    else if(iw+item[l] > fw+twFama || fw > twFama+iw+item[l]) return;
    else if(k==n-1) return;
    for(int i=0;i<n;i++)
    {

        if(isUsing[i])
            continue;
        isUsing[i]=true;
        twFama-=fama[i];
        iw+=fama[i];
        DFS(i+1,l,iw,fw);
        iw-=fama[i];

        fw+=fama[i];
        DFS(i+1,l,iw,fw);
        fw-=fama[i];
        twFama+=fama[i];
        isUsing[i]=false;
    }
}

int main()
{
    cin>>n>>m;
    item=new int[m];
    fama=new int[n];
    isUsing=new bool[n];
    fill(isUsing,isUsing+n,false);
    res=new bool[m];
    fill(res,res+m,false);

    sort(item,item+m);
    sort(fama,fama+n);

    for(int i=0;i<n;i++)
    {
        cin>>fama[i];
        twFama+=fama[i];
    }
    for(int i=0;i<m;i++)
    {
        cin>>item[i];
    }

    for(int i=0;i<m;i++)
    {
        DFS(0,i,0,0);
        if(res[i])
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
}
### 关于东华大学OJ平台上的‘积木游戏’编程题目解析 对于特定的在线评测系统中的问题解答,虽然提供的参考资料并未直接提及东华大学OJ平台上名为‘积木游戏’的具体题解[^1]。然而,在线评测系统的题目通常围绕算法设计、数据结构应用等方面展开。针对此类游戏类问题,一般涉及动态规划、贪心算法或是图论的相关概念。 考虑到该题目的名称暗示可能存在某种构建或拆卸过程,可以推测这道题可能涉及到如何有效地管理资源或者路径的选择。如果假设此题类似于经典的堆叠或移除物品的游戏,则解决方案可能会依赖于找到最优子结构性质来简化复杂度较高的暴力搜索方法。 为了更好地理解并解决这个问题,建议采取如下方式: - **仔细阅读题目说明**:确保完全明白给定条件和目标是什么。 - **分析输入输出样例**:通过观察给出的例子找出规律所在。 - **尝试简单情况下的手工模拟**:有助于发现潜在模式或边界状况。 - **查阅相似类型的经典案例及其优化技巧**:比如背包问题、最长公共子序列等问题所采用的方法或许能提供灵感。 最后值得注意的是,由于具体实现细节取决于实际的任务陈述,因此上述讨论仅基于有限的信息进行了合理猜测;要获得确切的答案还需要访问对应的OJ网站获取完整的题目描述,并据此编写相应的代码逻辑。 ```cpp // 下面展示了一个通用框架用于处理类似的组合/排列型问题, // 但请注意它不一定适用于具体的“积木游戏”,仅供示意用途。 #include <iostream> using namespace std; int main(){ // 假设这里有一些初始化操作... // 主循环体,读取测试用例数量或其他必要参数 // 对每一个实例执行核心计算部分 // 输出结果 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值