poj 1664 放苹果 (划分数)
题意:中文题目,不解释。。。
题解:
第一种方法是暴力深搜:枚举盘子1~n放苹果数量的所有情况,不需要剪枝;将每次枚举的情况,即每个盘的苹果数量,以字典序排序,然后存进set里 以此去重像"5 1 1"和"1 5 1"这种相同情况。
1 /** 2 * @author Wixson 3 */ 4 #include <iostream> 5 #include <cstdio> 6 #include <cstring> 7 #include <cmath> 8 #include <algorithm> 9 #include <queue> 10 #include <stack> 11 #include <vector> 12 #include <utility> 13 #include <map> 14 #include <set> 15 const int inf=0x3f3f3f3f; 16 const double PI=acos(-1.0); 17 const double EPS=1e-8; 18 using namespace std; 19 typedef long long ll; 20 typedef pair<int,int> P; 21 22 int n,m; 23 set<string> s; 24 set<string>::iterator ite; 25 int ans; 26 char str[12]; 27 void dfs(int pos,int left) 28 { 29 if(pos==n-1) 30 { 31 str[pos]='0'+left,str[n]='\0'; 32 string temp=str; 33 sort(temp.begin(),temp.end()); 34 if((ite=s.find(temp))==s.end()) 35 { 36 s.insert(temp); 37 ans++; 38 } 39 return; 40 } 41 // 42 for(int i=0;i<=left;i++) 43 { 44 str[pos]='0'+i; 45 dfs(pos+1,left-i); 46 } 47 } 48 int main() 49 { 50 //freopen("input.txt","r",stdin); 51 int t; 52 scanf("%d",&t); 53 while(t--) 54 { 55 scanf("%d%d",&m,&n); 56 ans=0; 57 s.clear(); 58 dfs(0,m); 59 printf("%d\n",ans); 60 } 61 return 0; 62 }
第二种方法: 递推。利用dp的思想,来看下样例:将7个苹果放进3个盘子里,可以分2种情况考虑:1.空着一个盘子不放,即将7个苹果放进2个盘子里;2.先每个盘子均放进一个苹果,然后将剩下的4个苹果放进3个盘子里。即dp[m][n]=dp[m-1][n]+dp[m-n][n](m>=n), 另外,显而易见 dp[m][n]=dp[m][m](m<n),dp[m][n]=1(m或n中有为1或0时);
1 /** 2 * @author Wixson 3 */ 4 #include <iostream> 5 #include <cstdio> 6 #include <cstring> 7 #include <cmath> 8 #include <algorithm> 9 #include <queue> 10 #include <stack> 11 #include <vector> 12 #include <utility> 13 #include <map> 14 #include <set> 15 const int inf=0x3f3f3f3f; 16 const double PI=acos(-1.0); 17 const double EPS=1e-8; 18 using namespace std; 19 typedef long long ll; 20 typedef pair<int,int> P; 21 22 int n,m; 23 int dp(int m,int n) 24 { 25 if(!n||!m||m==1||n==1) return 1; 26 if(m>=n) return dp(m,n-1)+dp(m-n,n); 27 else return dp(m,m); 28 } 29 int main() 30 { 31 //freopen("input.txt","r",stdin); 32 int t; 33 scanf("%d",&t); 34 while(t--) 35 { 36 scanf("%d%d",&m,&n); 37 printf("%d\n",dp(m,n)); 38 } 39 return 0; 40 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)