ACdreamoj1110(多重背包)
2015-09-10 10:23
363 查看
意甲冠军:多个裸露的双肩背包。水的问题。
解决方法:然背包一样,仅仅只是加一个数组,记录着每一个物品用过的次数,多于存储量时就pass不更新。
另一种方法是将每一个物品用二进制压缩处理。第一个代码比較简单;
代码:
解决方法:然背包一样,仅仅只是加一个数组,记录着每一个物品用过的次数,多于存储量时就pass不更新。
另一种方法是将每一个物品用二进制压缩处理。第一个代码比較简单;
代码:
/****************************************************** * author:xiefubao *******************************************************/ #pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <vector> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include <string.h> //freopen ("in.txt" , "r" , stdin); using namespace std; #define eps 1e-8 #define zero(_) (abs(_)<=eps) const double pi=acos(-1.0); typedef long long LL; const int Max=100010; const int INF=1000000007; int a[103]; int num[103]; int rem[Max]; bool ans[Max]; int n,cap; int main() { int t; //cout<<pow(6,4)-1<<endl; scanf("%d",&t);int kk=1; while(t--) { memset(ans,0,sizeof ans); scanf("%d%d",&n,&cap); for(int i=0; i<n; i++) scanf("%d",a+i); for(int i=0; i<n; i++) scanf("%d",num+i); ans[0]=1; for(int i=0; i<n; i++) { memset(rem,0,sizeof rem); for(int j=0; j<=cap; j++) { if(j+a[i]>cap||rem[j]>=num[i]) continue; if(ans[j]) { if(ans[j+a[i]]) { rem[j+a[i]]=min(rem[j+a[i]],rem[j]+1); continue; } ans[j+a[i]]=1; rem[j+a[i]]=rem[j]+1; } } } int out=0; for(int i=1; i<=cap; i++) if(ans[i]) out++; printf("Case %d: %d\n",kk++,out); } return 0; } /* 4 100000 1 12 456 5678 5 5 5 5 */
相关文章推荐
- Python 的集合运算
- JSON解析的四种方式
- AngularJS进阶(二)AngularJS路由问题解决
- js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
- Jenkins+maven+checkstyle对java代码进行静态代码分析
- 大数据架构师必读:常见的七种Hadoop和Spark项目案例
- c 语言结构中成员函数占用内存吗
- 植物大战僵尸金币位置
- aspx的static变量
- 用十年教会自己编程
- Mybatis传值语法
- binary_search(应用于有序区间)
- 将上拉加载更多下拉刷新PullToRefreshView用到项目中去
- AngularJS进阶(二)AngularJS路由问题解决
- js 判读 复选框checkox选中
- 算法与数据结构之冒泡排序
- ubuntu下搭建Asterisk及问题解决
- cvRectangle与cv::rectangle的用法
- js各种报错信息
- 上传图片