【背包总结】【输出最优解时候的最小数量】
2015-08-03 22:53
399 查看
#include <iostream> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <list> #include <map> #include <set> #include <string> #include <cstdlib> #include <cstdio> #include <algorithm> using namespace std; int n,tot; const int N = 10; const int M = 1000; int dp[M + 1]; int m[M + 1]; int v ; int w ; int main() { while(scanf("%d%d",&n,&tot) != EOF) { memset(dp,0,sizeof(dp)); memset(m,0,sizeof(m)); for(int i=0;i<n;i++) { scanf("%d%d",&w[i],&v[i]); } for(int i=0;i<n;i++) { for(int j=tot;j>=w[i];j--) { if(dp[j] == dp[j-w[i]] + v[i]) { if(m[j-w[i]] + 1 < m[j]) { m[j] = m[j-w[i]] + 1; } } else if(dp[j] < dp[j-w[i]] + v[i]) { dp[j] = dp[j-w[i]] + v[i]; m[j] = m[j-w[i]] + 1; } else { } } } cout << m[tot] << endl; } return 0; }
#include <iostream> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <list> #include <map> #include <set> #include <string> #include <cstdlib> #include <cstdio> #include <algorithm> using namespace std; int n,tot; const int N = 10; const int M = 1000; int dp[M + 1]; int m[M + 1]; int v ; int w ; int main() { while(scanf("%d%d",&n,&tot) != EOF) { memset(dp,0,sizeof(dp)); memset(m,0,sizeof(m)); for(int i=0;i<n;i++) { scanf("%d%d",&w[i],&v[i]); } for(int i=0;i<n;i++) { for(int j=tot;j>=w[i];j--) { if(dp[j] < dp[j-w[i]] + v[i] || dp[j] == dp[j-w[i]] + v[i] && m[j] > m[j-w[i]] + 1) { dp[j] = dp[j-w[i]] + v[i]; m[j] = m[j-w[i]] + 1; } } } cout << m[tot] << endl; } return 0; }
相关文章推荐
- 【背包总结】【输出方案总数】
- 递归算法实例
- tomcat配置外部应用
- 【JAVA】浅谈java枚举类
- 【背包总结-输出所有方案】
- 信号量、互斥体和自旋锁
- ABP之Javascript生成
- 网页制作之html基础学习4-格式与布局
- 周赛题解
- UITableView Cell
- 【背包总结I】
- CS281: Advanced Machine Learning 第三节 高斯模型
- STM8S精确延时+LED闪烁
- hdfs 客户端挂载,集群间复制
- ROS学习--(十三)编写简单的订阅器(subscriber),编译,测试
- centos 6实现ssh无密码登录的简便方法
- Android基础之Activity四种启动模式和task相关
- Java 打开文件夹
- Contiki例(三)使用etimer定时器激活被阻塞的任务
- UE4信息交互-蓝图类中的信息交互