case 没有 break 会穿透 (fall through)继续向下执行, 首先 i = 1 进入 case 1 由于没有 break 继续向下执行,进入case 2 n++,没有break 继续向下,进入 case 3 n++,自增两次所以结果为 2。
进入符合条件的case就会一直执行直到 break 或者 switch 结束。
1.这里根本没有循环什么事,switch是分支,你可以把它看做一堆if,它只会从头到尾执行一次
2.case标签中没有break,所以会贯穿标签
代码确实匹配了case 1,但是因为case 1里没有break,所以会依次往下执行,直到switch结束或者遇到break为止
所以会连续执行两次n++
执行case1之后因为没有break,所以还会执行下边的 case2 case3,那n++就执行了两次,结果就是2了
题目描述
张琪曼和李旭琳在魔法石矿里挖到了很多的魔法石,她们有一个背包,可以放入的重量为S,现有N件魔法石,重量分别为W1,W2,W3,…,Wn,各重量均为正整数,从N件魔法石中挑选若干件,使得放入的背包的重量之和正好为S。若成功,则输出放入背包的物品,否则输出“Failed!”。
输入
第一行两个整数即S和N,其中S<1000,N<32。第二行为N个整数,即N件物品的重量。
输出
若成功,则输出放入背包的物品,以空格间隔,否则输出”Failed!”。
复制样例数据
10 5
1 2 3 4 5
样例输出
1 4 5
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define inf 1000000007
typedef long long ll;
using namespace std;
bool dp(int w, vector<int> &v, int sz)
{
if (w == 0)
return true;
else if (w < 0)
return false;
else
{
if (sz <= 0)
return false;
if ( dp(w-v[sz-1], v, sz-1) )
{
printf("%d ",v[sz-1]);//cout<<v[sz-1]<<' ';
return true;
}
else
return dp(w, v, sz-1);
}
}
int main()
{
int w,n;
scanf("%d%d",&w,&n);
vector<int> v;
int t;
for(int i=0;i<n;i++){
scanf("%d",&t);
v.push_back(t);
}
int sz = v.size();
if(dp(w,v,sz)==false)
printf("Failed!");
//cout<<"Failed"<<endl;
return 0;
}
题目描述
张琪曼:“为什么背包一定要完全装满呢?尽可能多装不就行了吗?”
李旭琳:“你说得对,这和墨老师曾告诉我们的‘日中则昃,月满则亏’是一个道理。”所以,现在的问题是,她们有一个背包容量为v(正整数,0≤v≤20000),同时有n个魔法石(0≤n≤30),每个魔法石有一个体积 (正整数)。要求从n个魔法石中,任取若干个装入包内,使背包的剩余空间为最小。
输入
第一行为一个整数,表示背包容量,第二行为一个整数,表示有n个魔法石,接下来n行,分别表示这n个魔法石的各自体积。
输出
只有一个整数,表示背包剩余空间。
复制样例数据
24
6
8
3
12
7
9
7
样例输出
0
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define inf 1000000007
using namespace std;
typedef long long ll;
int dp[20010],s[40],rl,n;
int main(){
int i,j;
scanf("%d%d",&rl,&n);
for(i=1;i<=n;i++)
scanf("%d",&s[i]);
for(i=1;i<=n;i++)
for(j=rl;j>=1;j--)
if(j>=s[i])
dp[j]=max(dp[j],dp[j-s[i]]+s[i]);
printf("%d\n",rl-dp[rl]);
return 0;
}
题目描述
张琪曼和李旭琳有一个最多能用m公斤的背包,有n块魔法石,它们的重量分别是W1,W2,…,Wn,它们的价值分别为C1,C2,…,Cn。若每种魔法石只有一件,问能装入的最大总价值。
输入
第一行为两整数m和n,以下n行中,每行两个整数Wi,Ci,分别代表第i件物品的重量和价值。
输出
输出一整数,即最大价值。