多重部分和二进制优化
来源:互联网 发布:淘宝c店手机端图片尺寸 编辑:程序博客网 时间:2024/05/22 08:05
题目描述
有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;
}
- 多重部分和二进制优化
- 多重部分和问题(多重背包+二进制优化)
- 多重部分和问题优化
- 多重背包二进制优化
- 多重背包二进制优化
- 多重背包二进制优化
- 多重背包--二进制优化
- hdu1059Dividing 多重背包二进制优化
- HDU1059Dividing 二进制优化多重背包
- HDU2844_Coins【多重背包】【二进制优化】
- Dividing(多重背包+二进制优化)
- HDOJ2844Coins【多重背包+二进制优化】
- POJ1014Dividing【多重背包+二进制优化】
- hdu3732 多重背包+二进制优化
- 多重背包(二进制优化)
- 多重背包的二进制优化
- 多重背包(二进制优化)
- hdu2844 多重背包+二进制优化
- 生产者消费者问题的java实现
- hadoop 之 PathFilter -- 输入文件过滤器
- HDU:Big Event in HDU
- 事务的特性
- 第三周项目2-本月有几天?(if语句)
- 多重部分和二进制优化
- android根据银行卡卡号判断银行
- 测试测试
- Android电池信息(Battery information)
- poj-1664【放苹果】
- cpu cache line 原理
- 欢迎使用CSDN-markdown编辑器
- Golang1.7动态库的使用,C和Golang的动态库以及使用
- 一致性哈希算法(consistent hashing)