SDAU 课程练习3 1020
来源:互联网 发布:app切图软件 编辑:程序博客网 时间:2024/06/15 16:10
Problem T
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 9 Accepted Submission(s) : 2
Problem Description
Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibix opened purse and found there were some coins. He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact price(without change) and he known the price would not more than m.But he didn't know the exact price of the watch.<br><br>You are to write a program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value A1,A2,A3...An then calculate how many prices(form 1 to m) Tony can pay use these coins.
Input
The input contains several test cases. The first line of each test case contains two integers n(1 ≤ n ≤ 100),m(m ≤ 100000).The second line contains 2n integers, denoting A1,A2,A3...An,C1,C2,C3...Cn (1 ≤ Ai ≤ 100000,1 ≤ Ci ≤ 1000). The last test case is followed by two zeros.
Output
For each test case output the answer on a single line.
Sample Input
3 101 2 4 2 1 12 51 4 2 10 0
Sample Output
84
题目大意:
现在有好多硬币,面值分别为 a1.a2....ai,给出每个硬币的数量,求可以组成多少个不同的价值。
思路:
一开始的思路还是将相同的物品转化成多件物品,然后进行 0 1 求解,不出意料的超时。后来继续看了看背包九讲,明白了这个是多重背包的问题。
关于多重背包求解,具体的思路是这样。
当这件物品的数量*这件物品的体积 >= 背包容量 那么这件这就相当于完全背包,完全背包的定义:每件物品无限可用。
如果不够的话,那么就用 0 1 来解,把 1,2,3...k 件物品当成一件物品来看。
然后就这样喽。
感想:
。。。。。。。什么什么的好麻烦。最近心态不行。很无奈。
AC代码:
#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>using namespace std;int val[900005];int num[900005];int dp[900005];int v;void ZeroOnePack(int cost,int weight){ for(int i=v;i>=cost;i--) if(dp[i-cost]+weight>dp[i]) dp[i]=dp[i-cost]+weight;}void CompletePack(int cost,int weight){ for(int i=cost;i<=v;i++) if(dp[i-cost]+weight>dp[i]) dp[i]=dp[i-cost]+weight;}void MultiplePack(int cost ,int weight,int amount){ if(cost*amount>=v) CompletePack(cost,weight); else { for(int k=1;k<amount;) { ZeroOnePack(k*cost,k*weight); amount-=k; k<<=1; } ZeroOnePack(amount*cost,amount*weight); }}int main(){ //freopen("r.txt","r",stdin); int i,n,m,j; while(~scanf("%d%d",&n,&v)) { if(n==0&&v==0) break; for(i=0;i<n;i++) { scanf("%d",&val[i]); } for(i=0;i<n;i++) { scanf("%d",&num[i]); } memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) { MultiplePack(val[i],val[i],num[i]); } int temp=0,cou=0; for(i=0;i<=v;i++) { if(temp!=dp[i]) { temp=dp[i]; cou++; } } cout<<cou<<endl; } return 0;}
0 0
- SDAU 课程练习3 1020
- SDAU课程练习2 1020
- SDAU 课程练习3 1001
- SDAU 课程练习3 1002
- SDAU 课程练习3 1003
- SDAU 课程练习3 1004
- SDAU 课程练习3 1005
- SDAU 课程练习3 1008
- SDAU 课程练习3 1009
- SDAU 课程练习3 1014
- SDAU 课程练习3 1015
- SDAU 课程练习3 1016
- SDAU 课程练习3 1017
- SDAU 课程练习3 1018
- SDAU 课程练习3 1019
- SDAU 课程练习3 1021
- SDAU 课程练习3 1023
- SDAU 课程练习3 1024
- 解决 [Asp.net]Uploadify上传大文件 报Http error 404 问题
- 蓝牙打印
- django_模板
- glade工具安装及入门
- 【VS开发】CTabView多页卡界面
- SDAU 课程练习3 1020
- 数据结构—顺序表—删除某个元素
- 一起学Netty(一)之 Hello Netty
- 技术团队负责人应该具备怎样的能力
- 2017考研视屏资料计算机考研
- java socket报文通信(三)java对象和xml格式文件的相互转换
- 存储过程在数据库中的作用
- 为PPT架构师正名
- ViewPager添加导航栏