hdu 1709 The Balance
来源:互联网 发布:网络协议分析课后答案 编辑:程序博客网 时间:2024/05/17 02:48
我感觉这种题正是现在的我应该做的,感觉学到东西了,而不是坑的无奈
比赛时我就算看了估计也做不出来,压根不会想到dp那;
这个题是一个基础0-1dp吧,许多人用了母函数,但我基本不知道母函数是什么,无奈
思路:
dp[i][j]表示前i个物体是否能测量物体j,是为true,反为false;
状态转移方程:
dp[i-1][j]==1,则dp[i][j+a[i]]=1;dp[i][abs(a[i]-j)]=1;小心忘了dp[i][j]=1;
dp[0][0]=1;
因为从前往后推,所以dp[0][0]为true,能推出dp[1][a[1]]=1;
代码如下,已ac
#include<iostream>#include<cmath>#include<cstring>#include<queue>;using namespace std;int a[1100];bool dp[110][11000]={0};bool visit[10010]={0};int main(){ int n; int i,j; while(cin>>n) { memset(dp,false,sizeof(dp)); memset(visit,false,sizeof(visit)); queue<int> s; int i; int sum=0; for(i=1;i<=n;i++) { cin>>a[i]; sum+=a[i]; visit[a[i]]=true; dp[i][a[i]]=true; visit[sum]=true; dp[i][sum]=true; } dp[0][0]=true; for(i=1;i<=n;i++) { for(j=0;j<=sum;j++) { if(dp[i-1][j]==true) { dp[i][j]=true; dp[i][j+a[i]]=true; int k=abs(j-a[i]); dp[i][k]=true; visit[j+a[i]]=true; visit[k]=true; } } } int sum1=0; for(i=1;i<=sum;i++) { if(visit[i]!=1) { sum1++; s.push(i); } } cout<<sum1<<endl; int t=0; if(sum1!=0) { while(!s.empty()) { if(t!=0) { cout<<' '; } t=1; cout<<s.front(); s.pop(); } cout<<endl; } } return 0;}
0 0
- hdu 1709 The Balance
- hdu 1709 The Balance
- HDU 1709 The Balance
- hdu 1709-The Balance
- Hdu 1709 The Balance
- hdu 1709 The Balance
- hdu 1709 The Balance
- hdu 1709 The Balance
- hdu 1709 The Balance
- HDU 1709 The Balance
- hdu 1709 The Balance
- HDU 1709 The Balance
- HDU 1709 The Balance
- hdu 1709 The Balance
- hdu 1709 The Balance
- hdu 1709 The Balance (dp)
- hdu 1709 The Balance (母函数)
- hdu 1709——The Balance
- XML解析
- 【云快讯】之五十二《华为的公有云即将发布,名字还是个谜》
- 对Java事务的认识
- 黑马程序员--多线程
- iPhone 6s或将于9月发布,这些新功能打动你了么?
- hdu 1709 The Balance
- 暑假集训第二周——递推 骆驼猜名字
- Android 底部菜单配合listview的问题
- Xcode6以上不能安装插件管理工具解决办法
- 说说nio----1
- hdoj-2273-The buses
- HDOJ--1425 SORT (刚开始学ACM,用的是最简单的方法)
- 读取摄像头视频信息(解决VS运行过程中窗口闪一下关闭的问题)
- 如何将一个字符串倒序输出