Code Forces 189A - Cut Ribbon 暴力||DP
来源:互联网 发布:淘宝店基本常识 编辑:程序博客网 时间:2024/06/01 10:28
对一根长度为n绳子进行分割,要求分割后每段的长度只能是a,b,c中的一个
求能分成的最多的段数(保证有解)
思路一
完全背包 装满背包的最多选择的物品数
dp[i]表示长度为i的绳子最多可以分割成的段数
状态转移方程 dp[i]=max(dp[i],dp[i-x]+1);x为a或者b或者c
因为要求是装满,就是不能有剩余,所以初始化dp的时候除了dp[0]都初始化成负值,这样当dp[i-x]>=0的时候才能转移,可以保证装满。
#include<stdio.h>#include<string.h>#define max(a,b) a>b?a:bint main(){ int dp[4001]; int n,a,b,c; while(scanf("%d %d %d %d",&n,&a,&b,&c)!=EOF){ memset(dp,-1,sizeof(dp)); dp[0]=0; int mx=0; for(int i=1;i<=n;i++){ if(i>=a&&dp[i-a]>=0)dp[i]=max(dp[i-a]+1,dp[i]); if(i>=b&&dp[i-b]>=0)dp[i]=max(dp[i-b]+1,dp[i]); if(i>=c&&dp[i-c]>=0)dp[i]=max(dp[i-c]+1,dp[i]); } printf("%d\n",dp[n]); } return 0;}
暴力枚举.
a最多可以选择n/a个,剩余体积now=n-i*a
然后b最多可以选择now/b,剩余体积n-i*a-i*b
如果剩余体积可以被c整除,说明这个方案可以无剩余地切割,此时段数为i+j+(n-i*a-j*b)/c,
每找到一个合法的方案,更新最大值即可。
#include<stdio.h>#define max(a,b) a>b?a:bint main(){ int n,a,b,c; while(scanf("%d %d %d %d",&n,&a,&b,&c)!=EOF){ int mx=0; for(int i=0;i<=n/a;i++){ int now=n-i*a; for(int j=0;j<=now/b;j++){ if((n-i*a-j*b)%c==0) mx=max(mx,i+j+(n-i*a-j*b)/c); } } printf("%d\n",mx); } return 0;}
- Code Forces 189A - Cut Ribbon 暴力||DP
- codeforces 189a Cut Ribbon 水dp
- Codeforces189 A. Cut Ribbon(DP)
- CF - 189A - Cut Ribbon
- CF 189A Cut Ribbon
- CF 189 A Cut Ribbon
- codeforces 189A Cut Ribbon
- CodeForces 189A Cut Ribbon
- CodeForces 189A-Cut Ribbon
- CF 189A Cut Ribbon
- codeforces 189A. Cut Ribbon
- CodeForces 189A Cut Ribbon
- Codeforces-189A-Cut Ribbon
- Code Forces 342 A. Xenia and Divisors 思维+暴力
- Code Forces 327A - Flipping Game 贪心 暴力
- A. Cut Ribbon
- codefroces A. Cut Ribbon
- code forces 1A
- java读书笔记-《java设计模式》-第3章 - 适配器模式
- 用javascript获取querystring参数
- ubuntu12.04内核升级后Nvdia显卡出现分辨率不正常解决办法
- JNI 数据类型转换
- 用@方式插入多条数据到数据库/dataAdatper多条数据一次提交
- Code Forces 189A - Cut Ribbon 暴力||DP
- 并查集
- 黑马程序员-JDK1.5新特性(高新技术)
- 一个oracle 数据库创建多个实例
- C++类中的静态成员变量和静态成员函数的作用
- uva11865 - Stream My Contest
- 用数组做5组数的加法运算,大小写字母自由转化,文件加密原创代码
- JAVA获取中文汉字的拼音首字母
- Android传感器学习三---Position Sensor