vijos P1071
来源:互联网 发布:单片机ds18b20 编辑:程序博客网 时间:2024/06/11 17:00
学习动态规划的时候碰到的一点问题:就是把一些经典的问题转化为背包问题的思考方向,就是数学上所说的数学建模。
Link:http://www.vijos.cn/Problem_Show.asp?id=1071
这道题,刚刚开始看到的时候,就想到用搜索算法来计算(这个可以尝试去做,后期我会写)
要注意只有当前状态没有方案时才记录当前的方案,否则会把正确方案替换了。这是为什么呢?这就要讨论到一维背包问题中的最优解正确,但是方案不正确,在本文章总不做解释。
Code:
#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=500;int opt[maxn],ans[maxn],path[maxn];int a[maxn];//用来记录的是当前的数组 int main(void){ int n,total; while(scanf("%d %d",&total,&n)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",&a[i]);}//读入数据 memset(opt,0,sizeof(opt));//用来记录的是选择的方案 memset(ans,0,sizeof(ans));//用来记录的是最终的结果 memset(path,0,sizeof(path));//用来记录路径的opt[0]=1; for(int i=1;i<=n;i++)//这两个循环是背包问题的一维状态,可以参考背包九讲 { for(int j=total;j>=a[i];j--) { if(opt[j-a[i]]>0) { if(path[j]==0)//当前方案不存在的时候就选择 path[j]=i; opt[j]+=opt[j-a[i]]; } }}if(opt[total]==0)//没有方案 { printf("0\n"); continue; } if(opt[total]>1)//不止一个方案 { printf("-1\n"); continue; } int i=total; while(i>0)//求出选择的发难 { ans[path[i]]=1;//把组成当前方案的前一个元素设置为存在 i-=a[path[i]]; } for(int j=1;j<=n;j++)//输出结果 { if(ans[j]!=1)//这张牌不存在的话就输出 printf("%d ",j);} } return 0;}
输出:
270
4
100
110
170
200
2 4
0 0
- vijos P1071
- vijos-p1071 2008.11.9
- Vijos - P1071 新年趣事之打牌
- vijos P1071新年趣事之打牌
- Vijos P1071新年趣事之打牌
- Vijos P1071 新年趣事之打牌
- 【动态规划】Vijos P1071 新年趣事之打牌
- |Vijos|动态规划|P1071 新年趣事之打牌
- Vijos P1071 新年趣事之打牌(动态规划,背包,统计方案数)
- 洛谷 P1071 潜伏者
- 洛谷 P1071 潜伏者
- P1071 潜伏者
- 洛谷 P1071 潜伏者
- 洛谷 P1071 潜伏者
- P1071 潜伏者
- 洛谷P1071 潜伏者
- P1071 潜伏者
- 洛谷 P1071 潜伏者
- iOS应用程序的完整启动过程及其工作原理
- android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a vi
- 第8周项目6 本月有几天
- web工程 路径问题 服务器的根 web工程的根
- mongodb 批量更新 操作文档的数组键
- vijos P1071
- 添加远程库
- xelatex乱码问题解决
- CURL模拟登陆
- 实验二:线性表实验
- 程序设计作业报告项目六——本月有几天
- struts域驱动模式的实现
- BZOJ 3207 花神的嘲讽计划I Hash+可持久化线段树/划分树
- 安装和配置fedora19要做的那些事,超值经验