描述
有乙個神奇的口袋,總的容積是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就可以得到這些物...