欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

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

程序员文章站 2022-07-03 09:26:50
链接:https://ac.nowcoder.com/acm/problem/13586来源:牛客网题意:小M想知道某件物品的重量,但是摆在他面前的只有一个天平(没有游标)和一堆石子,石子可以放左边也可以放右边。他现在知道每个石子的重量。问能不能根据上述条件,能不能测出所问的重量。题解:  根据输入描述,石头数量n(1<=n<=100),每个石头重量wi(1<=wi<=100),也就是说,最大能称量100∗100=1e4100*100=1e4100∗100=1e4范围的...

链接:https://ac.nowcoder.com/acm/problem/13586
来源:牛客网
NOWCODER 小M和天平(动态规划DP)
NOWCODER 小M和天平(动态规划DP)

题意:

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

题解:

  根据输入描述,石头数量n(1<=n<=100),每个石头重量wi(1<=wi<=100),也就是说,最大能称量100100=1e4100*100=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";
		}
	}
}

本文地址:https://blog.csdn.net/cat_hate_fish/article/details/107625425

相关标签: 数据结构、算法