ACdream 1110 True love (多重背包+dp)
来源:互联网 发布:提现接口网站 php 编辑:程序博客网 时间:2024/05/16 05:54
题目链接:
ACdream 1110
题意:
给你一些物品的体积和对应的数量,求可以拿走多少种总体积不一样的物品,且不超过背包的容量。
题解:
多重背包呗。
设
那么容易得到转移方程:
最后再统计一遍就可以了。
AC代码:
#include<bits/stdc++.h>using namespace std;const int maxn = 100010;int n,cap;int a[maxn],b[maxn];int dp[maxn];int main(){ int t ; scanf("%d",&t); for(int i =1;i<=t;i++) { printf("Case %d: ",i); scanf("%d%d",&n,&cap); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(int i=1;i<=n;i++) { scanf("%d",&b[i]); } for(int i=1;i<=cap;i++){ dp[i] = -1; } dp[0] = 0; for(int i=1;i<=n;i++) { for(int j=1;j<=cap;j++) { if(dp[j]!=-1){ dp[j] = 0; } } for(int j = 0;j <= cap;j++) { if(dp[j] == -1)continue; if(dp[j] > b[i]) { dp[j] = -1;continue; } if(j + a[i] <= cap && (dp[ j + a[i] ] == -1 || dp[ j + a[i] ] >= dp[j] + 1)) { dp[j+a[i]] = dp[j] + 1; } } } int ans = 0; for(int i=1;i<=cap;i++) { // cout<<"dp["<<i<<"]="<<dp[i]<<endl; if(dp[i] != -1) { ans ++; } } cout<<ans<<endl; } return 0; }
阅读全文
1 0
- ACdream 1110 True love (多重背包+dp)
- Acdream 1110 True love(dp)
- I love sneakers!(多重背包)
- poj1742andHDOJ2844(DP多重背包)
- poj1742(多重背包dp)
- hdu2191 多重背包(dp)
- DP总结(1) 01背包 完全背包 多重背包
- pku 1742 Coins(多重背包dp)
- POJ 1742 - Coins (dp 多重背包)
- HDU 2191--DP--(多重背包)
- poj1276(DP多重背包)
- DP--多重背包--HDU2191
- dp 多重背包
- HDU 1059 DP (完全背包 && 多重背包)
- hdu 3033 I love sneakers!(背包DP)
- (DP,分组背包) I love sneakers! -- HDOJ
- True love
- POJ1014 Dividing 多重背包[DP]
- 扔石头的问题Stone
- UVA
- netty学习一:用netty构造http服务的小demo
- Linux系统结构
- linux驱动篇之 driver_register 过程分析(一)
- ACdream 1110 True love (多重背包+dp)
- GeoMesa-Accumulo安装并运行示例
- Virtualbox高性能读写Win10主机共享目录
- mysql 事务的写法与使用
- Android Fragment真正的完全解析(上)
- linux驱动篇之 driver_register 过程分析(二)bus_add_driver
- 常见的排序算法
- 7月23日
- java 中几种常用数据结构