多重部分和二进制优化
2016-09-10 15:59
211 查看
多重部分和问题
题目描述
有n中不同大小的数字ai,每种各mi个。判断是否可以从这些数字之中选出若干使他们的大小恰好为K.
限制条件
1<=n<=100
1<=ai,mi<=100000
1<=k<=100000
输入
多组数据。
第一行n。第二行不同的数字ai.第三行对应数字拥有的个数
输出
能挑选若干恰好和为K则输出“Yes”,反之输出“No”.
样例输入
1
3
3 5 8
3 2 2
17
样例输出
Yes
#include <stdio.h>
#include <string.h>
int dp[100005];
int a[105];
int m[105];
int main()
{
int t, i, j, z, n, k, ans;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
for(i = 0; i < n; i++)
scanf("%d", &m[i]);
scanf("%d", &k);
memset(dp, -0x3f, sizeof(dp));
dp[0] = 0;
for(i = 0; i < n; i++)
{
if(m[i] * a[i] >= k)
{
for(j = a[i]; j <= k; j++)
dp[j] = dp[j] > dp[j - a[i]] + a[i] ? dp[j] : dp[j - a[i]] + a[i];
}
else
{
ans = 1;
while(m[i] - ans >= 0)
{
for(j = k; j >= ans * a[i]; j--)
dp[j] = dp[j] > dp[j - ans * a[i]] + ans * a[i] ? dp[j] : dp[j - ans * a[i]] + ans * a[i];
m[i] -= ans;
ans <<= 1;
}
if(m[i] > 0)
{
for(j = k; j >= m[i] * a[i]; j--)
dp[j] = dp[j] > dp[j - m[i] * a[i]] + m[i] * a[i] ? dp[j] : dp[j - m[i] * a[i]] + m[i] * a[i];
}
}
}
if(dp[k] == k)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
题目描述
有n中不同大小的数字ai,每种各mi个。判断是否可以从这些数字之中选出若干使他们的大小恰好为K.
限制条件
1<=n<=100
1<=ai,mi<=100000
1<=k<=100000
输入
多组数据。
第一行n。第二行不同的数字ai.第三行对应数字拥有的个数
输出
能挑选若干恰好和为K则输出“Yes”,反之输出“No”.
样例输入
1
3
3 5 8
3 2 2
17
样例输出
Yes
#include <stdio.h>
#include <string.h>
int dp[100005];
int a[105];
int m[105];
int main()
{
int t, i, j, z, n, k, ans;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
for(i = 0; i < n; i++)
scanf("%d", &m[i]);
scanf("%d", &k);
memset(dp, -0x3f, sizeof(dp));
dp[0] = 0;
for(i = 0; i < n; i++)
{
if(m[i] * a[i] >= k)
{
for(j = a[i]; j <= k; j++)
dp[j] = dp[j] > dp[j - a[i]] + a[i] ? dp[j] : dp[j - a[i]] + a[i];
}
else
{
ans = 1;
while(m[i] - ans >= 0)
{
for(j = k; j >= ans * a[i]; j--)
dp[j] = dp[j] > dp[j - ans * a[i]] + ans * a[i] ? dp[j] : dp[j - ans * a[i]] + ans * a[i];
m[i] -= ans;
ans <<= 1;
}
if(m[i] > 0)
{
for(j = k; j >= m[i] * a[i]; j--)
dp[j] = dp[j] > dp[j - m[i] * a[i]] + m[i] * a[i] ? dp[j] : dp[j - m[i] * a[i]] + m[i] * a[i];
}
}
}
if(dp[k] == k)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
相关文章推荐
- 多部分和问题(多重背包+二进制优化)
- 多重部分和问题(多重背包+二进制优化)
- java编译时优化的部分体现
- POJ1014 :Dividing(多重背包) 二进制优化
- [开源]KJFramework.Message 高性能二进制消息框架 - 多元素数组的高性能优化
- 51Nod-背包问题V2(多重背包+二进制优化)
- innodb部分参数优化
- 斜率优化应选择凸包哪部分
- hdu 2844 多重背包二进制优化
- Java 6中的线程优化真的有效么?——第二部分
- hdu 2844 Coins (多重背包+ 二进制优化)
- 【项目】优化算法设计(一):《遗传算法与工程优化》相关部分内容
- 多重背包的二进制优化
- 《阿里巴巴Android开发手册》v1.0.1更新,优化部分内容和示例代码
- 文盲的数据库指令优化心得:第二部分,指令变形和执行计划
- 《阿里巴巴Android开发手册》v1.0.1更新,优化部分内容和示例代码
- PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
- 完全背包的二进制优化
- Android 通过二进制运算原理优化内存
- HDU 2844 Coins(二进制优化)