📄 背包问题1(动规算法).cpp
字号:
/*
我真诚地保证
我自己独立地完成了整个程序从分析、设计到编码的所有工作。
如果在上述过程中,我遇到了什么困难而求教于人,那么,我将在程序实习报告中
详细地列举我所遇到的问题,以及别人给我的提示。
我的程序里中凡是引用到其他程序或文档之处,
我都已经在程序的注释里很清楚地注明了引用的出处。
我从未抄袭过别人的程序,也没有盗用别人的程序,
不管是修改式的抄袭还是原封不动的抄袭。
我编写这个程序,从来没有想过要去破坏或妨碍其他计算机系统的正常运转。
学号:00548250
姓名:卞超轶
*/
#include <iostream.h>
#include <assert.h>
void main()
{
int n, t;
cout <<"请输入商品的数量: ";
cin >> n;
assert(n > 0); //商品数量大于零
cout <<"请输入背包的载重(必须为整数,否则报错):";
cin >>t;
assert(t > 0); //背包载重大于零
int *w;
w = new int[n];
assert(w != NULL);
cout << "请依次输入各商品的重量(用空格分开,同时必须为整数,否则报错):\n";
int i, j;
for (i = 0; i < n; i++)
{
cin >> w[i];
assert(w[i] > 0); //商品重量大于零
}
int *s;
s = new int[t+1];
assert(s != NULL);
for (i = 0; i <= t; i++)
s[i] = 0;
s[0] = 1; //申请动态数组并初始化
//s[i]用来标记背包载重为i时能否恰好装满
for (i = 0; i < n; i++) //外层循环控制商品个数
for (j = t; j >= w[i]; j--) //内层循环寻找有解的背包
if (s[j-w[i]] != 0)
s[j] = 1; //如果载重为(j-w[i])的背包有解,那么载重为j的背包有解
if (s[t] != 0)
cout << "可以恰好填满背包。";
else cout << "不可以恰好填满背包。";
cout << endl;
delete[]w;
delete[]s;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -