NOWCODER 小M和天平(动态规划DP)

链接:https://ac.nowcoder.com/acm/problem/13586
来源:牛客网
在这里插入图片描述
在这里插入图片描述

题意:

小M想知道某件物品的重量,但是摆在他面前的只有一个天平(没有游标)和一堆石子,石子可以放左边也可以放右边。他现在知道每个石子的重量。问能不能根据上述条件,能不能测出所问的重量。

题解:

  根据输入描述,石头数量n(1<=n<=100),每个石头重量wi(1<=wi<=100),也就是说,最大能称量 100 ∗ 100 = 1 e 4 100*100=1e4 100100=1e4范围的物品,超过这个范围肯定称量不了了,输出“NO”即可

if(dp[i-1][j]) {
	dp[i][j]=1;//如果i-1个石头能把重量为j的物品称量出来,那么i个石头也能 
	dp[i][j+wi[i]]=1;//多了一个石头的重量为wi[i],若是物品的另一边放入石头,则能称量的物体重量+wi[i] 
	dp[i][abs(j-wi[i])]=1;//若是把wi[i]的石头放在物品这一边,则能称量的物体重量就要-wi[j] 
	//要考虑j-wi[i]<0的情况,也就是加进去的石头比物品还要重,那么可称量的物品重量就为负值了,
	//这个时候就要交换一下两边的石头,结果就是abs(j-wi[i])
}

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=110,maxwi=1e4+10;
int n,wi[maxn],dp[maxn][maxwi],m,k;
int main() {
	while(cin>>n) {
		for(int i=1; i<=n; i++) cin>>wi[i];
		memset(dp, 0, sizeof(dp));
		dp[0][0]=1;
		for(int i=1; i<=n; i++) {
			for(int j=0; j<=10000; j++) {
				if(dp[i-1][j]) {
					dp[i][j]=1;
					dp[i][j+wi[i]]=1;
					dp[i][abs(j-wi[i])]=1;
				}
			}
		}
		cin>>m;
		while(m--) {
			cin>>k;
			if(k<=10000 && dp[n][k]) cout<<"YES\n";
			else cout<<"NO\n";
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值