创造新世界算法

众所周知计算机代码底层计算都是0和1的计算,牛牛知道这点之后就想使用0和1创造一个新世界!牛牛现在手里有n个0和m个1,给出牛牛可以创造的x种物品,每种物品都由一个01串表示。牛牛想知道当前手中的0和1可以最多创造出多少种物品。
这是题目:
这是算法分析:我们采用动态规划的方法对问题进行求解,对于物体xi,我们可以选也可以不选,这样我们可以得出递推关系:我们用二位数组存储A[i][j]=Max(A[i][j],A[i-m[i]][j-n[i]])
下面的代码:
int main() {
char s[51];
int X, N, M, n[21] = { 0 }, m[21] = { 0 }, dp[501][501] = { 0 };
cin >> X >> N >> M;
for (int i = 1; i <= X; i++) {
cin >> s;
for (int j = 0; j < strlen(s); j++) {
if (s[j] == ‘0’)
n[i]++;//
else
m[i]++;
}
}
for (int i = 1; i <= X; i++)
for (int j = N; j >= n[i]; j–)
for (int k = M; k >= m[i]; k–)
dp[j][k] = max(dp[j][k], dp[j - n[i]][k - m[i]] + 1);//关键递推关系
//二维背包,使用动态规划求dp数组
cout << dp[N][M];
system(“pause”);
return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值