標籤:name www 題目 包括 pen space 動態規劃 std 測試
P2386 放蘋果題目背景
(poj1664)
題目描述
把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分發(5,1,1和1,1,5是同一種方法)
輸入輸出格式輸入格式:
第一行是測試資料的數目t(0 <= t <= 20),以下每行均包括二個整數M和N,以空格分開。1<=M,N<=10
輸出格式:
對輸入的每組資料M和N,用一行輸出相應的K。
輸入輸出範例輸入範例#1: 複製
17 3
輸出範例#1: 複製
8
輸入範例#2: 複製
17 3
輸出範例#2: 複製
8
正解思路:動態規劃。
f[i][j]表示放完了前i個蘋果後,有j個盤子不為空白,有多少種方案。
#include<map>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;map<string,int>vis;int t,n,m,ans;int num[11],bns[11];void dfs(int x){ if(x==n){ for(int i=1;i<=m;i++) num[i]=bns[i]; sort(num+1,num+1+m);string s; for(int i=1;i<=m;i++) s+=char(num[i]+‘0‘); if(!vis[s]){ ans++,vis[s]=1; } return ; } for(int i=1;i<=m;i++){ bns[i]+=1; dfs(x+1); bns[i]-=1; }}int main(){ scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); ans=0;dfs(0); cout<<ans<<endl; }}10分暴力代碼
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int t,n,k,ans;int dp[1000][1000];int main(){ scanf("%d",&t); while(t--){ scanf("%d%d",&n,&k); dp[0][0]=dp[1][1]=1; for(int i=1;i<=n;i++) for(int j=1;j<=k;j++){ if(i<j){ dp[i][j]=0;continue; } dp[i][j]=max(dp[i-j][j]+dp[i-1][j-1],dp[i][j]); } for(int i=1;i<=k;i++) ans+=dp[n][i]; cout<<ans<<endl;ans=0; memset(dp,0,sizeof(dp)); }}
洛穀 P2386 放蘋果