砝码秤重量
来源:互联网 发布:adpcm编解码算法 编辑:程序博客网 时间:2024/04/28 16:33
Description
设有1g 2g 3g 5g 10g 20g的砝码各若干枚(其总重<=1000),输出用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况。
Input
有多个测试数据
每个测试数据一行,由6个整数组成,分别是1g 2g 3g 5g 10g 20g砝码的数量
最后一行是0 0 0 0 0 0,不需要处理
Output
每组测试数据输出一行,输出总共可以称出的重量的数目。
Sample Input
1 1 1 1 1 1
0 0 0 0 0 0
Sample Output
41
方法一:
方法二:
f[i][j] 表示用前i种砝码能否表示j这种重量,能为1,不能为0。
f[i][0]=1即0都是可以表示的。
f[i][j] |= f[i-1][j-k*w[i]]; (k从0到a[i],a[i]为该种砝码的数量,另外需保证j-k*w[i]大于等于0)
另一种写法:
设有1g 2g 3g 5g 10g 20g的砝码各若干枚(其总重<=1000),输出用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况。
Input
有多个测试数据
每个测试数据一行,由6个整数组成,分别是1g 2g 3g 5g 10g 20g砝码的数量
最后一行是0 0 0 0 0 0,不需要处理
Output
每组测试数据输出一行,输出总共可以称出的重量的数目。
Sample Input
1 1 1 1 1 1
0 0 0 0 0 0
Sample Output
41
方法一:
0/1背包问题的思想,w[i]∈{1,2,3,5,10,20} 其中砝码重量可以相等,求用这些砝码可称出的不同重量的个数。
#include<cstring>#include<cstdio>using namespace std;int w[6]= {1,2,3,5,10,20},a[6];int dp[1001];int main(){ //freopen("a.txt","r",stdin); int i,j,k,sum,ans; while(1) { sum=0; for(i=0; i<6; i++) { scanf("%d",&a[i]); sum+=w[i]*a[i]; } if(!sum) break; memset(dp,0,sizeof(dp)); dp[0]=1; for(i=0; i<6; i++) { for(k=a[i]; k>0; k--) { for(j=sum; j>=w[i]; j--) if(dp[j-w[i]]) dp[j]=1; } } ans=0; for(i=1; i<=sum; i++) { if(dp[i]) ans++; } printf("%d\n",ans); } return 0;}
方法二:
f[i][j] 表示用前i种砝码能否表示j这种重量,能为1,不能为0。
f[i][0]=1即0都是可以表示的。
f[i][j] |= f[i-1][j-k*w[i]]; (k从0到a[i],a[i]为该种砝码的数量,另外需保证j-k*w[i]大于等于0)
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int w[7]={0,1,2,3,5,10,20};int a[7];int dp[7][1001];int sum;int f(){ memset(dp,0,sizeof(dp)); for(int i=0;i<=6;++i) dp[i][0]=1; for(int i=1;i<=6;++i) { for(int j=1;j<=sum;++j) { for(int k=0;k<=a[i] && j>=k*w[i];++k) { dp[i][j] |= dp[i-1][j-k*w[i]]; if(dp[i][j]) break; } } } int ans=0; for(int i=1;i<=sum;++i) if(dp[6][i]) ans++; return ans;}int main(){ //freopen("a.txt","r",stdin); int x,ans; while(1) { sum=0; for(int j=1;j<=6;++j) { scanf("%d",&x); a[j]=x; sum+=x*w[j]; } if(!sum) break; printf("%d\n",f()); } return 0;}
另一种写法:
#include<cstring> #include<cstdio> using namespace std; int w[7]={0,1,2,3,5,10,20},a[6]; int dp[7][1001]; int main() { //freopen("a.txt","r",stdin); int i,j,k,sum,ans; while(1) { sum=0; for(i=1;i<=6;i++) { scanf("%d",&a[i]); sum+=w[i]*a[i]; } if(!sum) break; //背包问题的核心代码 memset(dp,0,sizeof(dp)); for(j=1;j<=a[1];j++) //DP问题的初始化 dp[1][j*w[1]]=1; for(i=2;i<=6;i++) { for(j=1;j<=sum;j++) { for(k=0;k<=a[i];k++)//多重背包比0-1背包多的循环:对砝码个数的控制 { if(j-k*w[i] > 0 ) { if(dp[i-1][j-k*w[i]] == 1) dp[i][j]=1; } else if(j-k*w[i] == 0) dp[i][j]=1; } } } ans=0; for(i=1;i<=sum;i++) { if(dp[6][i]) ans++; } printf("%d\n",ans); } return 0; }
参考 :http://blog.csdn.net/hackbuteer1/article/details/7357453
- 砝码秤重量
- 砝码重量问题
- 华为OJ平台题目->砝码重量
- 使用天平称重,经验证,用四个砝码可以秤出1~40的全部整数重量,请问是哪四个砝码?
- 用四个砝码称出1—40克所有重量,四个砝码分别为多少? 梅氏砝码问题
- 现有一组砝码,重量互不相等,分别为m1,m2,m3…mn; 每种砝码对应的数量为x1,x2,x3...xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。
- 使用一个天枰称量100g以下的任意整数重量最少需要多少砝码?每个砝码多少克?(砝码永远只能放在天枰的一边,每个砝码的重量必须是整数)
- 砝码称重 5个砝码 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
- 玛法都是3的幂次方 重量x的物品砝码匹配
- nbut [1413] Weight 母函数 n个砝码 能称出的重量的个数
- 【HDU 1709】【母函数】The Balance【给出n个砝码,以及n个砝码的重量,求出(1~sum)中(sum为各砝码总和)不能被称出的重量】
- 砝码
- 27个砝码中,只有一个与其他26个砝码重量不同且不知该砝码是轻还是重,问最少需要称多少次能找到该砝码
- [百度]用天平称出1—280克所有整数克的重量,如果只能在一边放砝码,至少用( )个砝码
- 给出一个重物重量为X,另外提供的小砝码重量分别为1,3,9。。。3^N。 将重物放到天平左侧,问在两边如何添加砝码使两边平衡。 假设N无限大,但一种重量的砝码只有一个)
- 101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。
- 101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。
- 101个硬币100真、1假,真假区别在于重量。用无砝码天平称两次给出真币重还是假币重的结论
- ORM
- 关于谷歌眼镜的一些YY
- 发展中的linux4
- 插入排序 insert_sort1 与 insert_sort_while的区别 细节排查自己的习惯错在哪儿?
- MFC消息机制
- 砝码秤重量
- squid,nginx,lighttpd反向代理的区别
- vs2008 使用Visual Leak Detector检测内存泄漏
- 项目管理--做事
- Ubuntu安装虚拟机,实现文件和USB的共享
- ubuntu12.10(64bit) 的Virtualbox Kernel driver not installed错误
- php经典算法总结
- hdu 2612 Find a way
- rman 增量备份