动态规划7:砝码和种类优化成01背包问题
来源:互联网 发布:java socket编程实例 编辑:程序博客网 时间:2024/04/29 18:40
动态规划入门7
分类:算法与数据结构
例题6
砝码称重
来源:NOIP1996(提高组) 第四题
【问题描述】
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),用他们能称出的重量的种类数。
【输入文件】
a1 a2 a3 a4 a5 a6
(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个,中间有空格)。
【输出文件】
Total=N
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)。
【输入样例】
11 0 0 0 0
【输出样例】
TOTAL=3
【问题分析】
把问题稍做一个改动,已知a1+a2+a3+a4+a5+a6个砝码的重量w[i], w[i]∈{ 1,2,3,5,10,20} 其中砝码重量可以相等,求用这些砝码可称出的不同重量的个数.
这样一改就是经典的0/1背包问题的简化版了,求解方法完全和上面说的一样,这里就不多说了,只是要注意这个题目不是求最大载重量,是统计所有的可称出的重量的个数。
CODE
//2014年9月11日15:56:52 //author:BGY #include<stdio.h>#include<climits>#include<algorithm>#include<stack>#include<iostream>#include<cmath>#include<set>#include<vector>#include<map>#include<queue>#include<string.h>using namespace std;const int maxn=1010;bool f[maxn];typedef struct node{ int weight; int num;}node;node a[6];int main(void){ while(scanf("%d",&a[0].num)!=EOF) { if(a[0].num==-1) break; for(int i=1;i<6;i++) { scanf("%d",&a[i].num); } a[0].weight=1; a[1].weight=2; a[2].weight=3; a[3].weight=5; a[4].weight=10; a[5].weight=20; memset(f,false,sizeof(f)); f[0]=true; for(int i=0;i<6;i++) { for(int j=1000;j>=0;j--) { if(f[j])//代表的是有砝码可以达到这个和 { for(int k=0;k<=a[i].num;k++){ f[j+a[i].weight*k]=true; } } } } int cn=0; for(int i=1;i<=1000;i++) { if(f[i]) cn++; } cout<<cn<<endl; } return 0;}
COME ON
0 0
- 动态规划7:砝码和种类优化成01背包问题
- 动态规划-砝码称重问题
- 01背包问题的动态规划算法、蛮力法和空间优化算法
- 动态规划--01背包问题
- 动态规划--01背包问题
- 动态规划 01背包问题
- 01背包问题 动态规划
- 动态规划01背包问题
- 01背包问题 动态规划
- 动态规划 - 01背包问题
- 动态规划 01 背包问题
- 01背包问题【动态规划】
- 动态规划01背包问题
- 动态规划--01背包问题
- 01背包问题-动态规划
- 动态规划01背包问题
- 01背包问题 动态规划
- 01背包问题 动态规划
- Minimum Path Sum
- 阿里巴巴和亿万富翁马云
- 关于android.content.ContextWrapper.getResources(ContextWrapper.java:81)的一个空指针异常
- MySQL 创建用户自定义函数
- HierachyViewer的使用
- 动态规划7:砝码和种类优化成01背包问题
- RelativeLayout平分父容器宽度(Percentage width in a RelativeLayout)
- 完全解析input子系统设备模型之mini2440按键驱动程序
- 开发者容易犯的六个致命错误
- 关于linux kernel编译的几项关键点:
- 原始套接口的ping命令编程
- 400 - Unix ls
- 天涯海角,烦恼
- Maven编辑Java项目成jar