神奇的口袋(DP or DFS

2021-09-19 16:06:38 字數 1601 閱讀 6221

描述

有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2……an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john有多少種不同的選擇物品的方式。

輸入輸入的第一行是正整數n (1 <= n <= 20),表示不同的物品的數目。接下來的n行,每行有乙個1到40之間的正整數,分別給出a1,a2……an的值。

輸出輸出不同的選擇物品的方式的數目。

樣例輸入

3

2020

20

樣例輸出

3
因為最近剛學了搜尋嘛,所以一開始用dfs試了試,過了,但是在過程中引數的變化過程還是有些模稜兩可。

思路:每件物品有兩種方案,選和不選(你想到了什麼),直接深搜就可以了。

dfs code:

#include#include#include#include#include#include #include #include #include#include#include #include#include #include #define  inf  0x3f3f3f3f

#define mmt(a,b) memset(a,b,sizeof(a))

typedef long long ll;

const ll max=1000000;

using namespace std;

ll t,v[50];ll sum=0;

void dfs(ll totle,ll index)

//注意:這一句放在前邊,下邊index>t,否則index>t+1,

if(index>t) return ;//表面看來無關緊要,但是按現在順序比那樣可節省3倍時間

totle-=v[index];

dfs(totle,index+1);//選

totle+=v[index];

dfs(totle,index+1);//不選

}int main()

int main()

cout《每件物品選或不選,當然要聯想到動態規劃問題嘍

#include#include#include#include#include#include #include #include #include#include#include #include#include #include #define inf 0x3f3f3f3f

#define mmt(a,b) memset(a,b,sizeof(a))

typedef long long ll;

const ll max=1000000;

using namespace std;

ll dp[50][50];//dp[i][j]從前j個物品湊出體積i的方法數

ll v[50];

ll n;

int main()

dp[0][0]=1;

for(ll i=1;i<=40;++i)

for(ll j=1;j<=n;++j)

cout<}

神奇的口袋

原題 有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,j...

神奇的口袋

時間限制 1 sec 記憶體限制 32 mb 有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,jo...

神奇的口袋

於牛客考研真題 題目描述 有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物...