vijosp1037-类背包问题&好题-搭建双塔
来源:互联网 发布:公司网络改造 编辑:程序博客网 时间:2024/06/07 13:43
https://vijos.org/p/1037
问你用以下的数字构建两个 相同高度的双塔,尽可能的高。
开始的思路是 背包计数。
如果 dp[m] 和dp[m/2] 和m%2==0 都满足,那么我们就可以输出m/2
(m和 m/2 这些数字都能拼出来。。)
但是即使这样,其实也不一定是可以的,因为很可能 m/2构成的两次使用了重叠的项,而我们并没有阻止这一种情况
// 这时错误的代码。过了不到一半的数据qwq#include <bits/stdc++.h>using namespace std;const int maxn=3000;int a[maxn];int dp[maxn];int m;int main(){ scanf("%d",&m); int sum=0; for(int i=0;i<m;i++){ scanf("%d",&a[i]); sum+=a[i]; } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=0;i<m;i++){ for(int j=sum;j>=a[i];j--) dp[j]+=dp[j-a[i]]; } int x=sum; while(1){ if(dp[x]&&x%2==0&&dp[x/2]>=2){ printf("%d\n",x/2); break; } else x--; } return 0;}
正解是 类似背包的dp
dp[i][j] 表示使用了1-i个数字,两个塔差值为j时候 矮塔的个数。
#include <bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;const int maxn=3000;int a[maxn];int dp[2][maxn];int m;int main(){ scanf("%d",&m); int sum=0; for(int i=1;i<=m;i++){ scanf("%d",&a[i]); sum+=a[i]; } for(int i=0;i<2;i++){ for(int j=1;j<maxn;j++) dp[i][j]=-inf; } for(int i=1;i<=m;i++){ for(int j=0;j<=sum;j++){ dp[i%2][j]=max(dp[i%2][j],dp[(i-1)%2][j]);//不使用 当前第i个数字 if(j>=a[i]) dp[i%2][j]=max(dp[i%2][j],dp[(i-1)%2][j-a[i]]); // 将这个数字放在高塔上。(这点注意思考) if(j+a[i]<=sum) dp[i%2][j]=max(dp[i%2][j],dp[(i-1)%2][j+a[i]]+a[i]);// 放在矮塔上。大小并未改变。 if(j<a[i]) dp[i%2][j]=max(dp[i%2][j],dp[(i-1)%2][a[i]-j]+a[i]-j);//放在矮塔上,埃塔变成了高塔。(这个数字大于差值。改变了 ) } } bool flag=false; if(dp[(m)%2][0]){ printf("%d\n",dp[(m)%2][0]); flag=true; } if(!flag) puts("Impossible"); return 0;}
阅读全文
0 0
- vijosp1037-类背包问题&好题-搭建双塔
- vijosP1037搭建双塔
- vijosp1037搭建双塔-较为清晰简单的思路-动态规划01背包-差值dp
- vijosp1037搭建双塔-较为清晰简单的思路-动态规划01背包-差值dp
- ZOJ3164【背包问题(好题)】
- vijos1037搭建双塔(一维背包问题)
- poj 背包问题 提好汇总
- 01背包问题 (好难理解)
- [HDU 5534] Partial Tree (完全背包问题) (好题)
- nyoj 完全背包 311 (完全背包) 好题
- dp 背包好题 zju 1013
- HDOJ Robberies(好题背包)
- hdu5501The Highest Mark(贪心+背包,好题)
- hdoj--2955--Robberies(背包好题)
- hdoj Consumer 3449 (背包)好题
- nyoj860 01背包变形-好题
- Vijos P1037 搭建双塔(动态规划,二维背包)
- 一题背包问题
- 对角线之和
- java2
- #CCF准备一年日常刷题#2011604-1 折点计数
- wrk调用lua测试性能
- os -- 进程同步
- vijosp1037-类背包问题&好题-搭建双塔
- 记录下自己学习中的疑问
- windows10: windows python+opencv环境搭建(最新)
- Hibernate-01-API及环境搭建
- java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode
- Linux下tar命令
- React组件之间传值
- Ubuntu16.04修改mysql编码
- 利用iso镜像文件,安装yum源